[SK shieldus Rookies 16기][AWS] AWS CLI를 이용한 VPC, EC2 인스턴스 생성 실습

Jina·2023년 12월 5일
0

SK shieldus Rookies 16기

목록 보기
32/59
post-thumbnail
post-custom-banner

참조
🔗AWS CLI Command Reference
🔗 EC2 명령어 목록

실습하기 전

1. CLI 설치

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

2. CLI 설치 확인

cmd창

# AWS 버전 확인
$ aws --version

aws-cli/2.14.5 Python/3.11.6 Windows/10 exe/AMD64 prompt/off
# aws-cli/2.14.5 ⇒ AWS CLI버전 2.14.5
# Python/3.11.6 ⇒ AWS CLI가 Python3.11.6버전으로 실행중
# exe/AMD64 ⇒ Windows/10 - AWS CLI가 현재 Win10에서 실행중
# prompt/off ⇒ AWS CLI가 64비트 파일로 실행중 현재 AWS CLI 프롬프트 꺼짐 

3. 엑세스 키 생성 또는 확인

엑세스 키가 없거나 모르는 경우, 삭제 후 재발급

4. AWS CLI에서 사용할 사용자 정보를 등록


실습

1. VPC 생성

기본 VPC를 삭제하고 실습을 진행
왜? 실습 중 헷갈릴 수 있기 때문에 헷갈리지 않으면 삭제하지 않아도 무관

VPC 생성

$ aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=MyVPC}]" --output json

# create-vpc ⇒ VPC 생성 명령어
# --cidr-block 10.0.0.0/16 ⇒ 생성할 VPC의 IP 주소 범위 설정
# --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=MyVPC}]" 
# 			⇒  태그 명세 
#			 	생성할 VPC에 태그 지정(aka 별칭) 
#				ResourceType → vpc, Key → Name, Value → MyVPC로 설정. 
# 				Tags의 Key == 태그명, Value == VPC명
# --output json ⇒ VPC 생성 결과를 JSON 형식으로 출력

2. VPC ID 확인

# VPC 확인 명령어
$ aws ec2 describe-vpcs

{
    "Vpcs": [
    	# MyVPC 시작
        {
            "CidrBlock": "10.0.0.0/16",
            "DhcpOptionsId": "dopt-0e6300d94c8a1967b",
            "State": "available",
            # VPC ID 확인
            "VpcId": "vpc-0493dba30e97a1fdb",
            "OwnerId": "750300976708",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-03dc019abc61e1587",
                    "CidrBlock": "10.0.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyVPC"
                }
            ]
        },
        {
            "CidrBlock": "10.0.0.0/16",
            "DhcpOptionsId": "dopt-0e6300d94c8a1967b",
} # MyVPC 끝

n번째 VPC의 ID 반환받기

생성된 VPC의 정보는 Vpcs 라는 배열 내 딕셔너리 형태로 저장된다.

# Vpcs 배열에서 0번째 객체의 VpcId 키 값을 가져와라
$ aws ec2 describe-vpcs --query "Vpcs[0].VpcId"

"vpc-0493dba30e97a1fdb"
# Vpcs 배열의 모든 객체들의 VpcId 키 값을 가져와라
$ aws ec2 describe-vpcs --query "Vpcs[*].VpcId"

[
    "vpc-0493dba30e97a1fdb", # 내가 생성한 VPC
    "vpc-010b31d9d5f48ee0b"	 # 기존에 있던 VPC
]

3. VPC ID를 환경변수로 설정

1) 환경 변수 설정

# 환경변수 선언
# 형식) set 환경변수명 = 값 
$ set VPC_ID=vpc-0493dba30e97a1fdb

2) 환경 변수 확인

# 환경변수 참조 시 %환경변수명%
$ echo %VPC_ID%

# 환경변수 값으로 설정했던 VPC ID 확인 가능
vpc-0493dba30e97a1fdb

4. 인터넷 게이트웨이 생성 후 VPC에 연결

참조 https://docs.aws.amazon.com/cli/latest/reference/ec2/create-internet-gateway.html

1) 인터넷 게이트웨이 생성

$ aws ec2 create-internet-gateway --tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=MyIGW}]"
# create-internet-gateway ⇒ 인터넷 게이트웨이 생성
# --tag-specifications ⇒ 태그 명세(리소스 타입과 이름 + 태그 이름 지정 가능)
#		"ResourceType=internet-gateway, ⇒ 생성하려는 리소스 타입=인터넷 게이트웨이
#		Tags=[{Key=Name,Value=MyIGW}]" ⇒ 태그명=Name, 생성하려는 리소스명(인터넷게이트명)=MyIGW

{
    "InternetGateway": {
    	# 인터넷 게이트웨이와 연결되어 있는 VPC 정보 ⇒ 공란인 경우 연결된 VPC 없음
        "Attachments": [],
        # 인터넷 게이트웨이 ID 확인
        "InternetGatewayId": "igw-0a86528001b7d955c",
        "OwnerId": "750300976708",
        "Tags": [
            {
                "Key": "Name",
                "Value": "MyIGW"
            }
        ]
    }
}

2) 인터넷 게이트웨이 ID를 환경변수로 설정

# 환경변수 선언
# 형식) set 환경변수명 = 값
$ set IGW_ID=igw-0a86528001b7d955c
# 환경변수 IGW_ID 확인
$ echo %IGW_ID%

# 환경변수 IGW_ID에 부여한 값 확인
"igw-0a86528001b7d955c"

3) 인터넷 게이트웨이와 VPC를 연결

참조 https://docs.aws.amazon.com/cli/latest/reference/ec2/attach-internet-gateway.html

# 인터넷 게이트웨이-VPC 연결
$ aws ec2 attach-internet-gateway --vpc-id %VPC_ID% --internet-gateway %IGW_ID%
# attach-internet-gateway ⇒ 인터넷 게이트웨이에 VPC 연결
# --vpc-id %VPC_ID% ⇒ VPC ID는 환경변수 VPC_ID 값을 참조
# --internet-gateway %IGW_ID% ⇒ 인터넷 게이트웨이는 환경변수 IGW_ID 값을 참조

# 참고) 뒤에 --output json 추가 작성 시 연결 결과를 json 형식으로 출력해줌
# 인터넷 게이트웨이 확인
$ aws ec2 describe-internet-gateways

{
    "InternetGateways": [
        {
            # 인터넷 게이트웨이와 연결된 VPC 정보
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-0493dba30e97a1fdb"
                }
            ],
            "InternetGatewayId": "igw-0a86528001b7d955c",
            "OwnerId": "750300976708",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyIGW"
                }
            ]
        }
    ]
}

5. 퍼블릭 서브넷 생성

https://docs.aws.amazon.com/cli/latest/reference/ec2/create-subnet.html

1) 퍼블릭 서브넷A 생성

리전의 첫번째 가용영역에 생성

$ aws ec2 create-subnet --vpc-id %VPC_ID% --cidr-block 10.0.10.0/24 --availability-zone us-west-2a --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=PublicSubnetA}]"
# create-subnet ⇒ 서브넷 생성
# --vpc-id %VPC_ID% ⇒ VPC ID는 환경변수 VPC_ID를 참조
# --cidr-block 10.0.10.0/24 ⇒ 서브넷 IP 주소 범위 설정
# --availability-zone us-west-2a ⇒ 가용영역은 us-west-2a(미국 오레곤)
# --tag-specification ⇒ 태그 명세
# 		"ResourceType=subnet, ⇒ 생성하는 리소스 타입=서브넷
# 		Tags=[{Key=Name,Value=PublicSubnetA}]" ⇒ 태그명=Name, 리소스명(서브넷명)=PublicSubnetA

{
    "Subnet": { # 서브넷 PublicSubnetA 시작
        "AvailabilityZone": "us-west-2a",
        "AvailabilityZoneId": "usw2-az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.10.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-0939e937bfbb52a48",
        "VpcId": "vpc-0493dba30e97a1fdb",
        "OwnerId": "750300976708",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PublicSubnetA"
            }
        ],
        "SubnetArn": "arn:aws:ec2:us-west-2:750300976708:subnet/subnet-0939e937bfbb52a48",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    } # 서브넷 PublicSubnetA 끝
}

2) PublicSubnetC 서브넷 생성

리전의 세번째 가용영역에 생성 (해당 리전에 세번째 가용역역이 없으면 두번째 가용영역으로 설정)

$ aws ec2 create-subnet --vpc-id %VPC_ID% --cidr-block 10.0.30.0/24 --availability-zone us-west-2c --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=PublicSubnetC}]"

{
    "Subnet": { # 서브넷 PublicSubnetC
        "AvailabilityZone": "us-west-2c",
        "AvailabilityZoneId": "usw2-az3",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.30.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-0b69819bc708c9b46",
        "VpcId": "vpc-0493dba30e97a1fdb",
        "OwnerId": "750300976708",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PublicSubnetC"
            }
        ],
        "SubnetArn": "arn:aws:ec2:us-west-2:750300976708:subnet/subnet-0b69819bc708c9b46",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}

6. 퍼블릭 서브넷 ID를 환경변수로 지정

서브넷도 VPC와 마찬가지로 Subnets라는 배열에 딕셔너리 형태로 저장된다.

1) 생성된 퍼블릭 서브넷 내용 확인

$ aws ec2 describe-subnets --query "Subnets[*].{SubnetID:SubnetId, Name:Tags[0].Value}"
# describe-subnets ⇒ 서브넷 내용 중
# --query ⇒ 필터링
# "Subnets[*].{SubnetID:SubnetId, Name:Tags[0].Value}"
#			Subnets[*]. ⇒ 서브넷 전체를 가져오되
#			{SubnetID:SubnetId,⇒ SubnetID 항목에는 서브넷Id 그대로
# 			Name:Tags[0].Value}"⇒ Name 항목에는 태그 0번째 요소 중 Value(=리소스명)만 가져오기

[
    {
        "SubnetID": "subnet-0b69819bc708c9b46",
        "Name": "PublicSubnetC"
    },
    {
        "SubnetID": "subnet-0939e937bfbb52a48",
        "Name": "PublicSubnetA"
    }
]

내용을 테이블 형태로 보고 싶은 경우 --output table

$ aws ec2 describe-subnets --query "Subnets[*].{SubnetID:SubnetId, Name:Tags[0].Value}" --output table

-----------------------------------------------
|               DescribeSubnets               |
+----------------+----------------------------+
|      Name      |         SubnetID           |
+----------------+----------------------------+
|  PublicSubnetC |  subnet-0b69819bc708c9b46  |
|  PublicSubnetA |  subnet-0939e937bfbb52a48  |
+----------------+----------------------------+

2) 퍼블릭 서브넷 환경변수 설정

# 환경변수 설정
# 형식) set 환경변수명 = 값
$ set PublicSubnetA_ID=subnet-0b69819bc708c9b46
$ set PublicSubnetC_ID=subnet-0939e937bfbb52a48
# 환경변수 PublicSubnetA_ID 확인
# 형식) echo %환경변수%
$ echo %PublicSubnetA_ID%

# 환경변수 PublicSubnetA_ID에 지정된 값 확인
subnet-0b69819bc708c9b46

# 환경변수 PublicSubnetC_ID 설정
$ echo %PublicSubnetC_ID%

# 환경변수 PublicSubnetC_ID에 지정된 값 확인
subnet-0939e937bfbb52a48

7. 퍼블릭 서브넷 설정

인터넷 게이트웨이로의 라우팅을 설정

1) 퍼블릭 라우팅 테이블 생성

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-route-table.html

$ aws ec2 create-route-table --vpc-id %VPC_ID% --tag-specification "ResourceType=route-table,Tags=[{Key=Name,Value=PublicRouteTable}]"
# create-route-table ⇒ 라우트 테이블 생성
# --vpc-id %VPC_ID% ⇒ vpc id는 환경변수 VPC_ID 참조
# --tag-specification ⇒ 태그 명세
# 		 "ResourceType=route-table, ⇒ 생성하는 리소스 타입=라우트 테이블
# 		 Tags=[{Key=Name,Value=PublicRouteTable}]"⇒ 태그명=Name, 리소스명(=라우트 테이블명)=PublicRouteTable 설정

{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        # IGW에 라우팅 시 필요한 라우트 테이블 ID
        "RouteTableId": "rtb-00a2578f97e1b862c",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PublicRouteTable"
            }
        ],
        "VpcId": "vpc-0493dba30e97a1fdb",
        "OwnerId": "750300976708"
    }
}

2) 퍼블릭 라우팅 테이블 ID를 환경변수로 설정

$ aws ec2 describe-route-tables --query "RouteTables[*].{RouteTableID:RouteTableId, Name:Tags[0].Value}" --output table
# describe-route-tables ⇒ 라우트 테이블 내용 가져오기
# --query ⇒ 필터링
#  		"RouteTables[*].⇒ 라우트 테이블 전체를 가져오되
#  		{RouteTableID:RouteTableId, Name:Tags[0].Value}"  
#						⇒ RouteTableID 와 Name 항목만 표시
#						⇒ RouteTableID에는 라우트테이블Id
# 						⇒ Name 항목에는 Tags 0번째 항목에서 Value 키 값(=라우트테이블명) 가져오기 
# 		 --output table ⇒ 결과를 테이블 형태로 출력

-----------------------------------------------
|             DescribeRouteTables             |
+-------------------+-------------------------+
|       Name        |      RouteTableID       |
+-------------------+-------------------------+
|  None             |  rtb-0d8c3743b381aab82  |
|  PublicRouteTable |  rtb-00a2578f97e1b862c  |
|  None             |  rtb-0b5bacd955b430875  |
+-------------------+-------------------------+
# PublicRouteTable 환경변수 PUBLIC_RT_ID 선언
$ set PUBLIC_RT_ID=rtb-00a2578f97e1b862c
# 환경변수 PUBLIC_RT_ID 확인
$ echo %PUBLIC_RT_ID%

# 환경변수 PUBLIC_RT_ID 값 출력 확인
rtb-00a2578f97e1b862c

3) 퍼블릭 라우팅 테이블에 인터넷 게이트웨이로의 라우팅 정보를 추가

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-route.html

$ aws ec2 create-route --route-table-id %PUBLIC_RT_ID% --destination-cidr-block 0.0.0.0/0 --gateway-id %IGW_ID%
# create-route --route-table-id %PUBLIC_RT_ID% ⇒ 라우트 테이블id가 환경변수 PUBLIC_RT_ID의 참조값인 곳에 라우트 생성
# --destination-cidr-block 0.0.0.0/0 ⇒ 도착지 IP주소 범위 설정(0.0.0.0/0 = 모든 IP주소)
# --gateway-id %IGW_ID% ⇒ 라우팅할 인터넷 게이트웨이id가 환경변수 IGW_ID의 참조값 

{
    "Return": true # 생성 성공
}

4) EC2의 라우트 테이블 정보 가져오기

$  aws ec2 describe-route-tables --query "RouteTables[*].{Routes:Routes, Tags:Tags}"
# describe-route-tables --query ⇒ 라우트 테이블에서 볼 내용 필터링 설정
# 		"RouteTables[*].{Routes:Routes, Tags:Tags}" 
# 				⇒ 라우트 테이블 전체 내용을 가져오되
# 				⇒ Routes와 Tags 항목만 표시
#				⇒ Routes에는 Routes 내용 전부, Tags에는 Tags내용 전부 가져오기

[
    { # None 라우트 테이블
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": []
    },
    { # PublicRouteTable 라우트 테이블
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            },
            {
                "DestinationCidrBlock": "0.0.0.0/0",
                "GatewayId": "igw-0e0fe512c1c946255",
                "Origin": "CreateRoute",
                "State": "active"
            }
        ],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PublicRouteTable"
            }
        ]
    },
    { # None 라우트 테이블
        "Routes": [
            { 
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": []
    }
]

5) 특정 라우트 테이블만 조회

$ aws ec2 describe-route-tables --query "RouteTables[*].{Routes:Routes, Tags:Tags}" --filters "Name=route-table-id,Values=%PUBLIC_RT_ID%
# describe-route-tables --query ⇒ 라우트 테이블에서 볼 내용 필터링 설정
# "RouteTables[*].{Routes:Routes, Tags:Tags}" 
# 				⇒ 라우트 테이블 전체 내용을 가져오되
# 				⇒ Routes와 Tags 항목만 표시
#				⇒ Routes에는 Routes 내용 전부, Tags에는 Tags내용 전부 가져오기
# --filters "Name=route-table-id,Values=%PUBLIC_RT_ID%
#				⇒ 조회할 라우트 테이블 지정
#				⇒ Name(=필터명=Tags에 Key값)이 route-table-id고,
#				   Values(=라우트 테이블명)이 환경변수 PUBLIC_RT_ID 참조값인 것만 조회

[
    { # 라우트 테이블 PublicRouteTable에 라우트 목록
        "Routes": [
            {
                # (1) 로컬 라우팅
                # 목적지 IP 주소 범위가 10.0.0.0/16인 경우, 트래픽을 로컬 게이트웨이로 전달
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            },
            {
                # (2) 인터넷 게이트웨이로의 라우팅
                # 목적지 IP 주소가 모든 IP 주소인 경우, 트래픽을 인터넷 게이트웨이로 전달
                "DestinationCidrBlock": "0.0.0.0/0",
                "GatewayId": "igw-0e0fe512c1c946255",
                "Origin": "CreateRoute",
                "State": "active"
            }
        ],
        "Tags": [
            {	
                "Key": "Name",
                "Value": "PublicRouteTable"
            }
        ]
    }
]

6) 퍼블릭 라우트 테이블을 퍼블릭 서브넷에 연결

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-route-table.html

퍼블릭 라우트 테이블 - 퍼블릭 서브넷A 연결

$ aws ec2 associate-route-table --subnet-id %PublicSubnetA_ID% --route-table-id %PUBLIC_RT_ID%
# associate-route-table --subnet-id %PublicSubnetA_ID% ⇒ 서브넷id가 환경변수 PublicSubnetA_ID의 참조값인 서브넷과
# --route-table-id %PUBLIC_RT_ID% ⇒ 라우트 테이블id가 환경변수 PUBLIC_RT_ID의 참조값인 라우트 테이블 연결하기

{
    "AssociationId": "rtbassoc-0a8dec397606bf593",
    "AssociationState": {
        "State": "associated" # 연결성공
    }
}

퍼블릭 라우트 테이블 - 퍼블릭 서브넷C 연결

$ aws ec2 associate-route-table --subnet-id %PublicSubnetC_ID% --route-table-id %PUBLIC_RT_ID%
# associate-route-table --subnet-id %PublicSubnetA_ID% ⇒ 서브넷id가 환경변수 PublicSubnetC_ID의 참조값인 서브넷과
# --route-table-id %PUBLIC_RT_ID% ⇒ 라우트 테이블id가 환경변수 PUBLIC_RT_ID의 참조값인 라우트 테이블 연결하기

{
    "AssociationId": "rtbassoc-03c681c8097b0e176",
    "AssociationState": {
        "State": "associated" # 연결성공
    }
}

7) 퍼블릭 서브넷에 퍼블릭 IP 자동할당 기능 활성화

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-subnet-attribute.html

$ aws ec2 describe-subnets --query "Subnets[*].{Name:Tags[0].Value,SubnetId:SubnetId,CidrBlock:CidrBlock,EnablePublicIP:MapPublicIpOnLaunch}" --output table
# describe-subnets --query ⇒ 서브넷 필터링해서 조회
# "Subnets[*].{Name:Tags[0].Value,SubnetId:SubnetId,CidrBlock:CidrBlock,EnablePublicIP:MapPublicIpOnLaunch}"
#		⇒  서브넷 전체를 가져오되
#			Name(서브넷명),SubnetId(서브넷ID),CidrBlock(서브넷IP주소범위),EnablePublicIP(퍼블릭 IP주소 자동할당 여부) 필드만 표시
# --output table ⇒ 출력값을 테이블 형태로 출력

---------------------------------------------------------------------------------
|                                DescribeSubnets                                |
+--------------+-----------------+----------------+-----------------------------+
|   CidrBlock  | EnablePublicIP  |     Name       |          SubnetId           |
+--------------+-----------------+----------------+-----------------------------+
|  10.0.30.0/24|  False          |  PublicSubnetC |  subnet-0b69819bc708c9b46   |
|  10.0.10.0/24|  False          |  PublicSubnetA |  subnet-0939e937bfbb52a48   |
+--------------+-----------------+----------------+-----------------------------+

퍼블릭 IP주소 자동할당 설정 False → True로 변경해야 한다.

퍼블릭 서브넷 속성값 수정

# 퍼블릭 서브넷A
$ aws ec2 modify-subnet-attribute --subnet-id %PublicSubnetA_ID% --map-public-ip-on-launch
# modify-subnet-attribute --subnet-id %PublicSubnetA_ID% ⇒ 서브넷id가 환경변수 PublicSubnetA_ID의 참조값인 서브넷의 속성 수정
# --map-public-ip-on-launch ⇒ 퍼블릭 IP주소가 자동할당되도록 하는 옵션
# 참고) 퍼블릭 IP 자동 할당 기능을 비활성화하려면, --no-map-public-ip-on-launch 옵션을 사용

# 퍼블릭 서브넷C
$ aws ec2 modify-subnet-attribute --subnet-id %PublicSubnetC_ID% --map-public-ip-on-launch

수정된 퍼블릭 서브넷 속성값 확인

$ aws ec2 describe-subnets --query "Subnets[*].{Name:Tags[0].Value,SubnetId:SubnetId,CidrBlock:CidrBlock,EnablePublicIP:MapPublicIpOnLaunch}" --output table

---------------------------------------------------------------------------------
|                                DescribeSubnets                                |
+--------------+-----------------+----------------+-----------------------------+
|   CidrBlock  | EnablePublicIP  |     Name       |          SubnetId           |
+--------------+-----------------+----------------+-----------------------------+
|  10.0.30.0/24|  True           |  PublicSubnetC |  subnet-0b69819bc708c9b46   |
|  10.0.10.0/24|  True           |  PublicSubnetA |  subnet-0939e937bfbb52a48   |
+--------------+-----------------+----------------+-----------------------------+

8. VPC DNS 호스트 이름을 활성화

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-vpc-attribute.html

VPC DNS 호스트 이름을 활성화하는 이유?

  1. 인스턴스 간 통신 용이성: DNS 호스트 이름을 활성화하면, VPC 내의 인스턴스 간에 도메인 이름을 사용하여 통신을 쉽게 할 수 있습니다. 이는 IP 주소를 직접 사용하는 것보다 관리가 편리하며, 인스턴스의 IP 주소가 변경되더라도 도메인 이름은 동일하게 유지됩니다.
  2. 도메인 이름 시스템 (DNS) 확인: DNS 호스트 이름을 활성화하면, AWS의 DNS 서버가 인스턴스의 도메인 이름을 해당 IP 주소로 변환할 수 있습니다. 이는 인스턴스에 쉽게 액세스할 수 있게 해주며, 특히 동적으로 할당된 IP 주소를 가진 인스턴스에 유용합니다.
  3. 프라이빗 DNS 호스팅 영역: DNS 호스트 이름을 활성화하면, Route 53의 프라이빗 DNS 호스팅 영역을 사용하여 VPC 내의 인스턴스에 대한 사용자 정의 도메인 이름을 생성하고 관리할 수 있습니다. 이는 인스턴스를 쉽게 식별하고 관리하는 데 도움이 됩니다.
$ aws ec2 modify-vpc-attribute --vpc-id %VPC_ID% --enable-dns-hostnames
# modify-vpc-attribute --vpc-id %VPC_ID% ⇒ vpc id가 환경변수 VPC_ID의 참조값인 VPC의 속성 수정
# --enable-dns-hostnames ⇒ 퍼블릭 DNS 호스트이름 허용해주는 옵션

9. 프라이빗 서브넷 생성 및 환경변수 설정

(== IGW로 라우팅이 정의되지 않은 서브넷)

1) PrivateSubnetA 서브넷 생성 ⇒ 첫번째 가용영역에 생성

$ aws ec2 create-subnet --vpc-id %VPC_ID% --cidr-block 10.0.20.0/24 --availability-zone us-west-2a --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=PrivateSubnetA}]

{
    "Subnet": {
        "AvailabilityZone": "us-west-2a",
        "AvailabilityZoneId": "usw2-az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.20.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        # 서브넷 ID 확인
        "SubnetId": "subnet-0441cbd3fdc59fc44",
        "VpcId": "vpc-0493dba30e97a1fdb",
        "OwnerId": "750300976708",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PrivateSubnetA"
            }
        ],
        "SubnetArn": "arn:aws:ec2:us-west-2:750300976708:subnet/subnet-0441cbd3fdc59fc44",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}

2) PrivateSubnetC 서브넷 생성 ⇒ 세번째 가용영역에 생성

$ aws ec2 create-subnet --vpc-id %VPC_ID% --cidr-block 10.0.40.0/24 --availability-zone us-west-2c --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=PrivateSubnetC}]"

{
    "Subnet": {
        "AvailabilityZone": "us-west-2c",
        "AvailabilityZoneId": "usw2-az3",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.40.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        # 서브넷 ID 확인
        "SubnetId": "subnet-07fc439e7337c9fc3",
        "VpcId": "vpc-0493dba30e97a1fdb",
        "OwnerId": "750300976708",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PrivateSubnetC"
            }
        ],
        "SubnetArn": "arn:aws:ec2:us-west-2:750300976708:subnet/subnet-07fc439e7337c9fc3",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}

3) 프라이빗 서브넷 ID를 환경변수로 설정

$ aws ec2 describe-subnets --query "Subnets[*].{Name:Tags[0].Value, SubnetId:SubnetId}" --output table

------------------------------------------------
|                DescribeSubnets               |
+-----------------+----------------------------+
|      Name       |         SubnetId           |
+-----------------+----------------------------+
|  PrivateSubnetA |  subnet-0441cbd3fdc59fc44  |
|  PublicSubnetC  |  subnet-0b69819bc708c9b46  |
|  PublicSubnetA  |  subnet-0939e937bfbb52a48  |
|  PrivateSubnetC |  subnet-07fc439e7337c9fc3  |
+-----------------+----------------------------+

PrivateSubnetA 와 PrivateSubnetC의 서브넷 아이디를 환경변수로 설정

$ set PrivateSubnetA=subnet-0441cbd3fdc59fc44
$ set PrivateSubnetC=subnet-07fc439e7337c9fc3

환경변수 설정 확인

$ echo %PrivateSubnetA%
subnet-0441cbd3fdc59fc44

$ echo %PrivateSubnetC%
subnet-07fc439e7337c9fc

4) 프라이빗 서브넷 설정 확인

라우팅 테이블 정보 조회

$ aws ec2 describe-route-tables --query "RouteTables[*].{RouteTableId:RouteTableId, Routes:Routes, Name:Tags[0].Value}"
[	
    {
        "RouteTableId": "rtb-0d8c3743b381aab82",
        "Routes": [
            {	
            	# 프라이빗 라우팅 테이블
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Name": null
    },
    
    {
        "RouteTableId": "rtb-00a2578f97e1b862c",
        "Routes": [
            {	
            	# 퍼블릭 라우팅 테이블
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            },
            {	
                # IGW로의 라우팅을 포함
                "DestinationCidrBlock": "0.0.0.0/0",
                "GatewayId": "igw-0e0fe512c1c946255",
                "Origin": "CreateRoute",
                "State": "active"
            }
        ],
        "Name": "PublicRouteTable"
    },
    {
        "RouteTableId": "rtb-0b5bacd955b430875",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Name": null
    }
]

5) 기본 라우팅 테이블(프라이빗 라우팅 테이블로 활용) ID를 환경변수로 설정

$ set PRIVATE_RT_ID=rtb-0d8c3743b381aab82
$ echo %PRIVATE_RT_ID%
rtb-0d8c3743b381aab82

6) 기본 라우팅 테이블에 이름을 부여

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html

태그 추가

$ aws ec2 create-tags --resources %PRIVATE_RT_ID% --tags "Key=Name,Value=PrivateRouteTable"
$ aws ec2 describe-route-tables --query "RouteTables[*].{RouteTableId:RouteTableId, Routes:Routes, Name:Tags[0].Value}"

[
    {
        "RouteTableId": "rtb-0d8c3743b381aab82",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Name": "PrivateRouteTable"
    },
    {
        "RouteTableId": "rtb-00a2578f97e1b862c",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            },
            {
                "DestinationCidrBlock": "0.0.0.0/0",
                "GatewayId": "igw-0e0fe512c1c946255",
                "Origin": "CreateRoute",
                "State": "active"
            }
        ],
        "Name": "PublicRouteTable"
    },
    {
        "RouteTableId": "rtb-0b5bacd955b430875",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Name": "-"
    }
]

10. 프라이빗 서브넷에 프라이빗 라우팅 테이블을 연결

1) 프라이빗 서브넷A에 프라이빗 라우팅 테이블 연결

aws ec2 associate-route-table --subnet-id %PrivateSubnetA% --route-table-id %PRIVATE_RT_ID%
{
    "AssociationId": "rtbassoc-090c3647633896376",
    "AssociationState": {
        "State": "associated"
    }
}

문제

$ aws ec2 associate-route-table --subnet-id %PrivateSubnetC% --route-table-id %PRIVATE_RT_ID%
An error occurred (InvalidSubnetID.NotFound) when calling the AssociateRouteTable operation: The subnet ID 'subnet-07fc439e7337c9fc' does not exist

'subnet-07fc439e7337c9fc'끝에 3을 붙였어야 했는데 서브넷id를 오타냈다.

해결방법

$ aws ec2 describe-subnets

서브넷ID를 직접 수정하거나 변경하는 것은 불가능하다. 서브넷의 ID는 AWS에서 자동으로 생성되며, 한 번 생성된 ID는 수정할 수 없기때문에...일단 잘못된 기존 서브넷을 삭제하고 새로 생성하기로 했다.

# 서브넷 삭제
aws ec2 delete-subnet --subnet-id subnet-07fc439e7337c9fc3
# 프라이빗 서브넷C 생성
aws ec2 create-subnet --vpc-id %VPC_ID% --cidr-block 10.0.40.0/24 --availability-zone us-west-2c --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=PrivateSubnetC}]"
{
    "Subnet": {
        "AvailabilityZone": "us-west-2c",
        "AvailabilityZoneId": "usw2-az3",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.40.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        # 서브넷 ID 확인-------------------------
        "SubnetId": "subnet-0db65611fe1240bf6",
        #-------------------------------------
        "VpcId": "vpc-0493dba30e97a1fdb",
        "OwnerId": "750300976708",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "PrivateSubnetC"
            }
        ],
        "SubnetArn": "arn:aws:ec2:us-west-2:750300976708:subnet/subnet-0db65611fe1240bf6",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}

서브넷id와 이름을 테이블 형식으로 확인

$ aws ec2 describe-subnets --query "Subnets[*].{Name:Tags[0].Value, SubnetId:SubnetId}" --output table
------------------------------------------------
|                DescribeSubnets               |
+-----------------+----------------------------+
|      Name       |         SubnetId           |
+-----------------+----------------------------+
|  PrivateSubnetA |  subnet-0441cbd3fdc59fc44  |
|  PublicSubnetC  |  subnet-0b69819bc708c9b46  |
|  PublicSubnetA  |  subnet-0939e937bfbb52a48  |
|  PrivateSubnetC |  subnet-0db65611fe1240bf6  |
+-----------------+----------------------------+

프라이빗 서브넷id를 환경변수로 설정

$ set PrivateSubnetC=subnet-0db65611fe1240bf6

환경변수 설정 확인

$ echo %PrivateSubnetC%
subnet-0db65611fe1240bf6

2) 프라이빗 서브넷C에 프라이빗 라우팅 테이블 연결

aws ec2 associate-route-table --subnet-id %PrivateSubnetC% --route-table-id %PRIVATE_RT_ID%

{
    "AssociationId": "rtbassoc-0b04623064041d79e",
    "AssociationState": {
        "State": "associated"
    }
}

11. Management Console을 이용해서 리소스 생성을 확인

1) VPC > MyVPC의 DNS 호스트 이름, IP CIDR 확인

2) VPC > 인터넷 게이트웨이 > MyIGW의 상태 확인

3) VPC > 서브넷 > 서브넷 가용영역, 라우팅 테이블, IP CIDR 확인

-사진생략-

12. 키 페어 생성

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html

1) 이름이 AWS_CLI_KEY 인 키 페어 생성

$ aws ec2 create-key-pair --key-name AWS_CLI_KEY --query "KeyMaterial" --output text > AWS_CLI_KEY.pem

2) 생성된 키 타입 확인

$ type AWS_CLI_KEY.pem

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0Oi2k/xNcHj8y/HrtzaUIvkfPoc++snD8k/kxadsDOs9hRZA
pa9UItCKiFD8a9z/WUlX7Cvfy8luiJr/ZZSMiX1cGPfiSUxRhTgA3aaLn9LcN4sk
KTT/5TQVowkVI+/Ks+BFm6iMypj90gRhHrx9siTiUNK2okmXvlrVSRFHK88njgAK
CTKOdxioJPvLy7BRwVXqyfeilFNRn4mb8eOsy/O4MEsHlhH75eEjUEzV1fM/aLuw
fxyJfRJWFsHl9buIT3WDi1UD7pt80m6IKoaul21sZo1M0q1vK7V0F0ben1b736+z
vhsLKL07fdcMqNCKn/pyn8+JPIwxnnNMgGEjgQIDAQABAoIBAEgydI62HikllvAA
nl7F/PINOHAKm4heXFqMo9pvHtdkIPGynArmieQyP/4WRvYb/R9lSn5zNzedWJbb
QjJf4SXO7hou6MQ+HNo2XY48dXp5i+OiMZAQIfObSXL7u5Oc1mfNtSCzYlzN/MIt
A0d1CtebCZ+3AqkZV9jQWW+UCg2oPP2V4930z1GsX+mYw45T3lpkP72y1GT8E+tv
SeeUYNj39AXh97I+ziaHqvM8k5d8z42qd2GZkWxLTUZ28Vn1bzXCnCwSDmpp7moY
jCuH7vNIi4r/BsTdKY4uwyzeJFQFk0kVkWAoBJxRmrMsc5Jd8dAKp1iitLAMxXHM
RnRiqDECgYEA6rYkEjlPrVxQ1nK+42fmYsHwfIzxA39HJCK5Y4NzfIYJV1pZXVFV
NtQubkJc+2/94EEJADwg9yIzOt7H1uCH7r4JlNHuoI4SBc0funK0Uk7SnfBQ57SG
eL8rhaaVAX2H/BOkMaxtH6lBxdgmc4wh0cBsTpQkb8EFgIF+on860nUCgYEA49t0
dkVceRy6ZVumXMOCLMbIywwclPrAak2FAcWdUPrX//Lp3AtQFnJInM+M1II73hqq
XnkRWiiK7U8ODk3U5uxPe9sui9YVX989cHTrJHHX70eJfrKSW7eHtkTTFLTq0tOY
0slQRx2efLPoPsra0vuxurXYOn1lsWlvOuxUE10CgYEArxbK19FrD78TCra0kb27
TqaweKlHTb2P23QP6h1wdE8k/sYGbiezMuCb9mKJLISB1d2OEl/Ik7MullcEqtX6
cW3QhfUJVzpEVZGMfrD8tX3Zfjp8kCzKN58cn2oCNAdp/vDEBs5C5WCFEUrKfF3o
CKnL4d5/Q+Kw8Qko552TytUCgYEAo8tS6d4sfmd3WntKmO51+kgfeU7IkRO8E+6L
yV1MHDVl5nixQdvkA2694fOU8gJ4lM2oYOc44Q256KNmoEO04xdGf+tsh1sq3FM2
8Esr6XPo3PoYzboCWeoRpaXN8tmm4Ez5U7Uhfy28izosnk7mhLon5ebofAs+eg0n
xzyxp4UCgYB7Ibd1GaNCK7es28altbxWm0lOy3BOBXaIhLiN4TTCnDQ10gDsFVEv
l2RonF2Pr/iYWegVCoDH3R40f5eV0CW5ugCTjh8T4INiM5sMcDhq2GAGievry/rd
Zk7zjKEHYTRWhK9tbBb0Krq013naZatJnteeB6BJDfmZSN4FM+jlIg==
-----END RSA PRIVATE KEY-----

13. 보안 그룹

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html

1) 보안 그룹 생성

$ aws ec2 create-security-group --group-name MyWebServerSg --description "Security Group for MyWebServer" --vpc-id %VPC_ID%

{
    "GroupId": "sg-081366eef39977eba"
}

2) 보안 그룹 ID를 환경 변수로 설정

$ set MYWEBSERVER_SG=sg-081366eef39977eba
$ echo %MYWEBSERVER_SG%
sg-081366eef39977eba

3) 보안 그룹에 인바운드 규칙을 추가

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html

EC2 보안그룹 조회

$ aws ec2 describe-security-groups

{
    "SecurityGroups": [
        {
            "Description": "Security Group for MyWebServer",
            "GroupName": "MyWebServerSg",
            "IpPermissions": [],
            "OwnerId": "750300976708",
            "GroupId": "sg-081366eef39977eba",
            # 아웃바운드 규칙만 존재(모든 트래픽 허용)
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-0493dba30e97a1fdb"
        },
        {
            "Description": "default VPC security group",
            "GroupName": "default",
            "IpPermissions": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": [
                        {
                            "GroupId": "sg-05d45ff211effbf96",
                            "UserId": "750300976708"
                        }
                    ]
                }
            ],
            "OwnerId": "750300976708",
            "GroupId": "sg-05d45ff211effbf96",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-010b31d9d5f48ee0b"
        },
        {
            "Description": "default VPC security group",
            "GroupName": "default",
            "IpPermissions": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": [
                        {
                            "GroupId": "sg-04e65a11f169884f1",
                            "UserId": "750300976708"
                        }
                    ]
                }
            ],
            "OwnerId": "750300976708",
            "GroupId": "sg-04e65a11f169884f1",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-0493dba30e97a1fdb"
        }
    ]
}

특정 보안그룹에 인바운드 규칙 설정

$ aws ec2 authorize-security-group-ingress --group-id %MYWEBSERVER_SG% --protocol tcp --port 22 --cidr 0.0.0.0/0
# aws ec2 authorize-security-group-ingress --group-id %MYWEBSERVER_SG% ⇒ 보안그룹id가 환경변수 MYWEBSERVER_SG의 참조값인 보안그룹에 인바운드 규칙 추가
# --protocol tcp --port 22 --cidr 0.0.0.0/0 ⇒ 모든 IP주소에서 22번 포트로의 TCP 트래픽을 허용

{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-098ee9064b6617acf",
            "GroupId": "sg-081366eef39977eba",
            "GroupOwnerId": "750300976708",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIpv4": "0.0.0.0/0"
        }
    ]
}

특정 보안그룹에 인바운드 규칙 설정

$ aws ec2 authorize-security-group-ingress --group-id %MYWEBSERVER_SG% --protocol tcp --port 80 --cidr 0.0.0.0/0
# aws ec2 authorize-security-group-ingress --group-id %MYWEBSERVER_SG% ⇒ 보안그룹id가 환경변수 MYWEBSERVER_SG의 참조값인 보안그룹에 인바운드 규칙 추가
# --protocol tcp --port 80 --cidr 0.0.0.0/0 ⇒ 모든 IP주소에서 80번 포트로의 TCP 트래픽을 허용

{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0894762c75d7f8f4d",
            "GroupId": "sg-081366eef39977eba",
            "GroupOwnerId": "750300976708",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "CidrIpv4": "0.0.0.0/0"
        }
    ]
}

보안그룹 인바운드 규칙 설정 확인

$ aws ec2 describe-security-groups --filters Name=group-name,Values=MyWebServerSg
# group-name이 MyWebServerSg인 보안그룹만 조회

{
    "SecurityGroups": [
        {
            "Description": "Security Group for MyWebServer",
            "GroupName": "MyWebServerSg",
            "IpPermissions": [
                {
                    "FromPort": 80,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 80,
                    "UserIdGroupPairs": []
                },
                {
                    "FromPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 22,
                    "UserIdGroupPairs": []
                }
            ],
            "OwnerId": "750300976708",
            "GroupId": "sg-081366eef39977eba",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-0493dba30e97a1fdb"
        }
    ]
}

14. EC2 인스턴스 생성

1) 인스턴스 생성 시 사용할 사용자 데이터의 내용을 담고 있는 텍스트 파일을 생성

$ notepad user_data.txt

명령어 실행 시 메모장이 자동으로 열린다.
아래 내용을 입력하고 저장

#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo "<h1>Hello AWS CLI</h1>" > /var/www/html/index.html

2) 인스턴스 생성에 사용할 이미지ID 확인

EC2 > 이미지 > AMI 카탈로그 > ami-093467ec28ae4fe03 확인

3) 인스턴스를 생성

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html

$ aws ec2 run-instances --image-id ami-093467ec28ae4fe03 --count 1 --instance-type t2.micro --key-name AWS_CLI_KEY --security-group-id %MYWEBSERVER_SG% --subnet-id %PublicSubnetA_ID% --user-data file://user_data.txt --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=MyWebServer}]"

{
    "Groups": [],
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            # AMI 이미지로 생성된 것 확인 가능
            "ImageId": "ami-093467ec28ae4fe03",
            # 인스턴스 ID 확인
            "InstanceId": "i-08bf5b3248f347ae0",
            "InstanceType": "t2.micro",
            "KeyName": "AWS_CLI_KEY",
            "LaunchTime": "2023-12-05T07:14:05+00:00",
            "Monitoring": {
                "State": "disabled"
            },
            "Placement": {
                "AvailabilityZone": "us-west-2c",
                "GroupName": "",
                "Tenancy": "default"
            },
            "PrivateDnsName": "ip-10-0-30-41.us-west-2.compute.internal",
            "PrivateIpAddress": "10.0.30.41",
            "ProductCodes": [],
            "PublicDnsName": "", # 확인
            "State": {
                "Code": 0,
                "Name": "pending" # 확인
            },
            "StateTransitionReason": "",
            "SubnetId": "subnet-0b69819bc708c9b46",
            "VpcId": "vpc-0493dba30e97a1fdb",
            "Architecture": "x86_64",
            "BlockDeviceMappings": [],
            "ClientToken": "91079125-f47c-46db-a5f9-27f5627bd778",
            "EbsOptimized": false,
            "EnaSupport": true,
            "Hypervisor": "xen",
            "NetworkInterfaces": [
                {
                    "Attachment": {
                        "AttachTime": "2023-12-05T07:14:05+00:00",
                        "AttachmentId": "eni-attach-05a76e0a6ab1c962c",
                        "DeleteOnTermination": true,
                        "DeviceIndex": 0,
                        "Status": "attaching",
                        "NetworkCardIndex": 0
                    },
                    "Description": "",
                    "Groups": [
                        {
                            "GroupName": "MyWebServerSg",
                            "GroupId": "sg-081366eef39977eba"
                        }
                    ],
                    "Ipv6Addresses": [],
                    "MacAddress": "0a:6e:95:91:d6:5b",
                    "NetworkInterfaceId": "eni-0f00b75283b384431",
                    "OwnerId": "750300976708",
                    "PrivateDnsName": "ip-10-0-30-41.us-west-2.compute.internal",
                    "PrivateIpAddress": "10.0.30.41",
                    "PrivateIpAddresses": [
                        {
                            "Primary": true,
                            "PrivateDnsName": "ip-10-0-30-41.us-west-2.compute.internal",
                            "PrivateIpAddress": "10.0.30.41"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Status": "in-use",
                    "SubnetId": "subnet-0b69819bc708c9b46",
                    "VpcId": "vpc-0493dba30e97a1fdb",
                    "InterfaceType": "interface"
                }
            ],
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SecurityGroups": [
                {
                    "GroupName": "MyWebServerSg",
                    "GroupId": "sg-081366eef39977eba"
                }
            ],
            "SourceDestCheck": true,
            "StateReason": {
                "Code": "pending",
                "Message": "pending"
            },
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyWebServer"
                }
            ],
            "VirtualizationType": "hvm",
            "CpuOptions": {
                "CoreCount": 1,
                "ThreadsPerCore": 1
            },
            "CapacityReservationSpecification": {
                "CapacityReservationPreference": "open"
            },
            "MetadataOptions": {
                "State": "pending",
                "HttpTokens": "required",
                "HttpPutResponseHopLimit": 2,
                "HttpEndpoint": "enabled",
                "HttpProtocolIpv6": "disabled",
                "InstanceMetadataTags": "disabled"
            },
            "EnclaveOptions": {
                "Enabled": false
            },
            "BootMode": "uefi-preferred",
            "PrivateDnsNameOptions": {
                "HostnameType": "ip-name",
                "EnableResourceNameDnsARecord": false,
                "EnableResourceNameDnsAAAARecord": false
            },
            "MaintenanceOptions": {
                "AutoRecovery": "default"
            },
            "CurrentInstanceBootMode": "legacy-bios"
        }
    ],
    "OwnerId": "750300976708",
    "ReservationId": "r-0a6b3b79ad7901324"
}

4) 인스턴스 ID를 환경변수로 설정

인스턴스 아이디 확인

$ aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId"
[
    [
        "i-08bf5b3248f347ae0"
    ]
]

인스턴스ID를 환경변수명 INSTANCE_ID로 설정

$ set INSTANCE_ID=i-08bf5b3248f347ae0

환경변수 설정 확인

$ echo %INSTANCE_ID%
i-08bf5b3248f347ae0

15. 인스턴스의 퍼블릭 주소를 확인

aws ec2 describe-instances --instance-id %INSTANCE_ID% | findstr Public

# 퍼블릭 DNS 이름 "" → "ec2-34-219-94-206.us-west-2.compute.amazonaws.com"
"PublicDnsName": "ec2-34-219-94-206.us-west-2.compute.amazonaws.com",
# 퍼블릭 IP 주소 확인
"PublicIpAddress": "34.219.94.206",
		"PublicDnsName": "ec2-34-219-94-206.us-west-2.compute.amazonaws.com",
    	"PublicIp": "34.219.94.206"
    			"PublicDnsName": "ec2-34-219-94-206.us-west-2.compute.amazonaws.com",
            	"PublicIp": "34.219.94.206"

16. 인스턴스의 퍼블릭 주소로 SSH 접속

$ ssh -i "AWS_CLI_KEY.pem" ec2-user@34.219.94.206

The authenticity of host '34.219.94.206 (34.219.94.206)' can't be established.
ECDSA key fingerprint is SHA256:Uij1aTTb1xhnlPgMNzMrBo6d4LfBbqc8AvCXObvBE2U.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '34.219.94.206' (ECDSA) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
       
[ec2-user@ip-10-0-30-41 ~]$ cat /var/www/html/index.html
#  user_data.txt 파일에 명시했던 내용과 동일한 내용이 출력
<h1>Hello AWS CLI</h1>

httpd 서비스 동작 확인

[ec2-user@ip-10-0-30-41 ~]$ systemctl status httpd

● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     # httpd 서비스 동작 중
     Active: active (running) since Tue 2023-12-05 07:14:58 UTC; 14min ago
       Docs: man:httpd.service(8)
   Main PID: 4052 (httpd)
     Status: "Total requests: 4; Idle/Busy workers 100/0;Requests/sec: 0.00477; Bytes served/sec:   3 B/se>
      Tasks: 230 (limit: 1114)
     Memory: 16.1M
        CPU: 572ms
     CGroup: /system.slice/httpd.service
             ├─ 4052 /usr/sbin/httpd -DFOREGROUND
             ├─ 4134 /usr/sbin/httpd -DFOREGROUND
             ├─ 4140 /usr/sbin/httpd -DFOREGROUND
             ├─ 4141 /usr/sbin/httpd -DFOREGROUND
             ├─ 4142 /usr/sbin/httpd -DFOREGROUND
             └─25880 /usr/sbin/httpd -DFOREGROUND

Dec 05 07:14:58 ip-10-0-30-41.us-west-2.compute.internal systemd[1]: Starting httpd.service - The Apache H>
Dec 05 07:14:58 ip-10-0-30-41.us-west-2.compute.internal systemd[1]: Started httpd.service - The Apache HT>
Dec 05 07:14:58 ip-10-0-30-41.us-west-2.compute.internal httpd[4052]: Server configured, listening on: por>
lines 1-20/20 (END)

17. 인스턴스 설정 확인

EC2 > 인스턴스 > MyWebServer 인스턴의 유형과 서브넷ID, AMI ID, 할당된 키페어 확인

18. 리소스 정리

1) 인스턴스 종료

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html

$ aws ec2 terminate-instances --instance-id %INSTANCE_ID%

{
    "TerminatingInstances": [
        {
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "InstanceId": "i-08bf5b3248f347ae0",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

인스턴스 조회

$ aws ec2 describe-instances --instance %INSTANCE_ID% --query "Reservations[*].Instances[*].State"

[
    [
        {
            "Code": 48,
            "Name": "terminated"
        }
    ]
]

2) 보안 그룹 삭제

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html

$ aws ec2 describe-security-groups --filter "Name=group-name,Values=%MYWEBSERVER_SG%"

{
    "SecurityGroups": []
}

3) 서브넷 삭제

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-subnet.html

# 퍼블릭 서브넷A 삭제
$ aws ec2 delete-subnet --subnet-id %PublicSubnetA_ID%

# 퍼블릭 서브넷C 삭제
$ aws ec2 delete-subnet --subnet-id %PublicSubnetC_ID%

# 프라이빗 서브넷A 삭제
$ aws ec2 delete-subnet --subnet-id %PrivateSubnetA%

# 프라이빗 서브넷C 삭제
$ aws ec2 delete-subnet --subnet-id %PrivateSubnetC%

4) 인터넷 게이트웨이를 VPC와 분리

참조 https://docs.aws.amazon.com/cli/latest/reference/ec2/detach-internet-gateway.html

인터넷 게이트웨이 조회

$ aws ec2 describe-internet-gateways

{
    "InternetGateways": [
        {
            # igw 상태 확인
            "Attachments": [],
            "InternetGatewayId": "igw-0a86528001b7d955c",
            "OwnerId": "750300976708",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyIGW"
                }
            ]
        },
        {
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-0493dba30e97a1fdb"
                }
            ],
            "InternetGatewayId": "igw-0e0fe512c1c946255",
            "OwnerId": "750300976708",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyIGW"
                }
            ]
        }
    ]
}

VPC와 인터넷 게이트웨이 분리

aws ec2 detach-internet-gateway --vpc-id %VPC_ID% --internet-gateway-id %IGW_ID%

인터넷 게이트웨이 확인

aws ec2 describe-internet-gateways

{
    "InternetGateways": [
        {
            "Attachments": [],
            "InternetGatewayId": "igw-0a86528001b7d955c",
            "OwnerId": "750300976708",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyIGW"
                }
            ]
        },
        {
            "Attachments": [],
            "InternetGatewayId": "igw-0e0fe512c1c946255",
            "OwnerId": "750300976708",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyIGW"
                }
            ]
        }
    ]
}

5) 인터넷 게이트웨이 삭제

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-internet-gateway.html

# 인터넷 게이트웨이 ID를 환경변수로 설정한 경우
$ aws ec2 delete-internet-gateway --internet-gateway-id %IGW_ID%

# 인터넷 게이트웨이 ID 직접 지정해서 삭제
$ aws ec2 delete-internet-gateway --internet-gateway-id igw-0a86528001b7d955c

인터넷 게이트웨이 삭제 확인

$ aws ec2 describe-internet-gateways
{
    "InternetGateways": []
}

6) 퍼블릭 라우트 테이블을 삭제

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-route-table.html

$ aws ec2 describe-route-tables --query "RouteTables[*].{Name:Tags[0].Value,RouteTableId:RouteTableId}" --output table

------------------------------------------------
|              DescribeRouteTables             |
+--------------------+-------------------------+
|        Name        |      RouteTableId       |
+--------------------+-------------------------+
|  PrivateRouteTable |  rtb-0d8c3743b381aab82  |
|  PublicRouteTable  |  rtb-00a2578f97e1b862c  |
|  -                 |  rtb-0b5bacd955b430875  |
+--------------------+-------------------------+
# 퍼블릭 라우트 테이블 삭제
aws ec2 delete-route-table --route-table-id %PUBLIC_RT_ID%
# 라우트 테이블 확인
aws ec2 describe-route-tables --query "RouteTables[*].{Name:Tags[0].Value,RouteTableId:RouteTableId}" --output table

------------------------------------------------
|              DescribeRouteTables             |
+--------------------+-------------------------+
|        Name        |      RouteTableId       |
+--------------------+-------------------------+
|  PrivateRouteTable |  rtb-0d8c3743b381aab82  |
|  -                 |  rtb-0b5bacd955b430875  |
+--------------------+-------------------------+

프라이빗 라우트 테이블은 삭제 불가! 왜? 기본 라우트 테이블이므로 삭제할 수 없음. 삭제 시 에러 메세지 발생됨.

An error occurred (DependencyViolation) when calling the DeleteRouteTable operation: 
The routeTable 'rtb-0d8c3743b381aab82' has dependencies and cannot be deleted.

7) 키페어 삭제

참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html

키페어 조회

aws ec2 describe-key-pairs

{
    "KeyPairs": [
        {
            "KeyPairId": "key-0c330cecab61e503c",
            "KeyFingerprint": "31:ed:8d:a5:2b:6f:81:c4:f1:e2:e4:57:15:9a:d2:b4:da:eb:8d:7d",
            "KeyName": "MyKeyPair-020",
            "KeyType": "rsa",
            "Tags": [],
            "CreateTime": "2023-11-30T07:56:15.625000+00:00"
        },
        {
            "KeyPairId": "key-0dda1fab01f5c17f8",
            "KeyFingerprint": "1c:5e:95:6e:06:de:8f:20:ee:30:dd:b0:c0:ba:8e:28:74:fc:ac:0b",
            # 삭제할 키
            "KeyName": "AWS_CLI_KEY",
            "KeyType": "rsa",
            "Tags": [],
            "CreateTime": "2023-12-05T07:01:06.305000+00:00"
        }
    ]
}

AWS_CLI_KEY 키 페어 삭제

$ aws ec2 delete-key-pair --key-name AWS_CLI_KEY

{
    "Return": true,
    "KeyPairId": "key-0dda1fab01f5c17f8"
}

키 페어 삭제 확인

$ aws ec2 describe-key-pairs

{
    "KeyPairs": [
        {
            "KeyPairId": "key-0c330cecab61e503c",
            "KeyFingerprint": "31:ed:8d:a5:2b:6f:81:c4:f1:e2:e4:57:15:9a:d2:b4:da:eb:8d:7d",
            "KeyName": "MyKeyPair-020",
            "KeyType": "rsa",
            "Tags": [],
            "CreateTime": "2023-11-30T07:56:15.625000+00:00"
        }
    ]
}

8) VPC 삭제

VPC 확인

$ aws ec2 describe-vpcs

{
    "Vpcs": [
        {
            "CidrBlock": "10.0.0.0/16",
            "DhcpOptionsId": "dopt-0e6300d94c8a1967b",
            "State": "available",
            "VpcId": "vpc-0493dba30e97a1fdb",
            "OwnerId": "750300976708",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-03dc019abc61e1587",
                    "CidrBlock": "10.0.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "MyVPC"
                }
            ]
        },
        {
            "CidrBlock": "10.0.0.0/16",
            "DhcpOptionsId": "dopt-0e6300d94c8a1967b",
            "State": "available",
            "VpcId": "vpc-010b31d9d5f48ee0b",
            "OwnerId": "750300976708",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-0bc11024454dfc801",
                    "CidrBlock": "10.0.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false
        }
    ]
}

VPC 삭제

# 환경변수로 설정한 VPC 삭제
aws ec2 delete-vpc --vpc-id %VPC_ID%

# 특정 VPC 삭제
aws ec2 delete-vpc --vpc-id vpc-010b31d9d5f48ee0b

VPC 삭제 확인

# VPC 삭제 확인
aws ec2 describe-vpcs

{
    "Vpcs": []
}

PrivateRouteTable(원래는 기본 라우트 테이블이었음)도 함께 삭제되는 것 확인 가능

# 라우트 테이블 확인
aws ec2 describe-route-tables

{
    "RouteTables": []
}

profile
공부 기록
post-custom-banner

0개의 댓글