https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html
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 프롬프트 꺼짐
엑세스 키가 없거나 모르는 경우, 삭제 후 재발급
기본 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 형식으로 출력
# 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 끝
생성된 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
]
# 환경변수 선언
# 형식) set 환경변수명 = 값
$ set VPC_ID=vpc-0493dba30e97a1fdb
# 환경변수 참조 시 %환경변수명%
$ echo %VPC_ID%
# 환경변수 값으로 설정했던 VPC ID 확인 가능
vpc-0493dba30e97a1fdb
참조 https://docs.aws.amazon.com/cli/latest/reference/ec2/create-internet-gateway.html
$ 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"
}
]
}
}
# 환경변수 선언
# 형식) set 환경변수명 = 값
$ set IGW_ID=igw-0a86528001b7d955c
# 환경변수 IGW_ID 확인
$ echo %IGW_ID%
# 환경변수 IGW_ID에 부여한 값 확인
"igw-0a86528001b7d955c"
참조 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"
}
]
}
]
}
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-subnet.html
리전의 첫번째 가용영역에 생성
$ 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 끝
}
리전의 세번째 가용영역에 생성 (해당 리전에 세번째 가용역역이 없으면 두번째 가용영역으로 설정)
$ 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
}
}
}
서브넷도 VPC와 마찬가지로 Subnets라는 배열에 딕셔너리 형태로 저장된다.
$ 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"
}
]
$ aws ec2 describe-subnets --query "Subnets[*].{SubnetID:SubnetId, Name:Tags[0].Value}" --output table
-----------------------------------------------
| DescribeSubnets |
+----------------+----------------------------+
| Name | SubnetID |
+----------------+----------------------------+
| PublicSubnetC | subnet-0b69819bc708c9b46 |
| PublicSubnetA | subnet-0939e937bfbb52a48 |
+----------------+----------------------------+
# 환경변수 설정
# 형식) 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
인터넷 게이트웨이로의 라우팅을 설정
참조
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"
}
}
$ 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
참조
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 # 생성 성공
}
$ 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": []
}
]
$ 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"
}
]
}
]
참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-route-table.html
$ 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" # 연결성공
}
}
$ 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" # 연결성공
}
}
참조
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 |
+--------------+-----------------+----------------+-----------------------------+
참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-vpc-attribute.html
VPC DNS 호스트 이름을 활성화하는 이유?
- 인스턴스 간 통신 용이성: DNS 호스트 이름을 활성화하면, VPC 내의 인스턴스 간에 도메인 이름을 사용하여 통신을 쉽게 할 수 있습니다. 이는 IP 주소를 직접 사용하는 것보다 관리가 편리하며, 인스턴스의 IP 주소가 변경되더라도 도메인 이름은 동일하게 유지됩니다.
- 도메인 이름 시스템 (DNS) 확인: DNS 호스트 이름을 활성화하면, AWS의 DNS 서버가 인스턴스의 도메인 이름을 해당 IP 주소로 변환할 수 있습니다. 이는 인스턴스에 쉽게 액세스할 수 있게 해주며, 특히 동적으로 할당된 IP 주소를 가진 인스턴스에 유용합니다.
- 프라이빗 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 호스트이름 허용해주는 옵션
(== IGW로 라우팅이 정의되지 않은 서브넷)
$ 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
}
}
}
$ 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
}
}
}
$ 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 |
+-----------------+----------------------------+
$ set PrivateSubnetA=subnet-0441cbd3fdc59fc44
$ set PrivateSubnetC=subnet-07fc439e7337c9fc3
$ echo %PrivateSubnetA%
subnet-0441cbd3fdc59fc44
$ echo %PrivateSubnetC%
subnet-07fc439e7337c9fc
라우팅 테이블 정보 조회
$ 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
}
]
$ set PRIVATE_RT_ID=rtb-0d8c3743b381aab82
$ echo %PRIVATE_RT_ID%
rtb-0d8c3743b381aab82
참조
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": "-"
}
]
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
aws ec2 associate-route-table --subnet-id %PrivateSubnetC% --route-table-id %PRIVATE_RT_ID%
{
"AssociationId": "rtbassoc-0b04623064041d79e",
"AssociationState": {
"State": "associated"
}
}
-사진생략-
참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html
$ aws ec2 create-key-pair --key-name AWS_CLI_KEY --query "KeyMaterial" --output text > AWS_CLI_KEY.pem
$ 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-----
참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html
$ aws ec2 create-security-group --group-name MyWebServerSg --description "Security Group for MyWebServer" --vpc-id %VPC_ID%
{
"GroupId": "sg-081366eef39977eba"
}
$ set MYWEBSERVER_SG=sg-081366eef39977eba
$ echo %MYWEBSERVER_SG%
sg-081366eef39977eba
참조
https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html
$ 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"
}
]
}
$ 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
EC2 > 이미지 > AMI 카탈로그 > ami-093467ec28ae4fe03
확인
참조
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"
}
인스턴스 아이디 확인
$ aws ec2 describe-instances --query "Reservations[*].Instances[*].InstanceId"
[
[
"i-08bf5b3248f347ae0"
]
]
$ set INSTANCE_ID=i-08bf5b3248f347ae0
$ echo %INSTANCE_ID%
i-08bf5b3248f347ae0
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"
$ 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>
[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)
EC2 > 인스턴스 > MyWebServer 인스턴의 유형과 서브넷ID, AMI ID, 할당된 키페어 확인
참조
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"
}
]
]
참조
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": []
}
참조
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%
참조 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"
}
]
}
]
}
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"
}
]
}
]
}
참조
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": []
}
참조
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.
참조
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 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"
}
]
}
$ 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 삭제
aws ec2 delete-vpc --vpc-id %VPC_ID%
# 특정 VPC 삭제
aws ec2 delete-vpc --vpc-id vpc-010b31d9d5f48ee0b
# VPC 삭제 확인
aws ec2 describe-vpcs
{
"Vpcs": []
}
PrivateRouteTable(원래는 기본 라우트 테이블이었음)도 함께 삭제되는 것 확인 가능
# 라우트 테이블 확인
aws ec2 describe-route-tables
{
"RouteTables": []
}