EC2 인스턴스 목록(인벤토리) 만들기
EC2 인스턴스 목록(인벤토리) 만들기 (Create an inventory of your EC2 instances)
Amazon EC2는 온디맨드로 확장 가능한 컴퓨팅 용량을 제공해요. EC2 인스턴스는 AWS 네트워크에서 실행되는 가상 서버예요.
출처: 문서
본문
다음 표는 EC2 인스턴스의 주요 특성을 설명해요. 시스템 관리자는 이 가이드에 제공된 지침을 사용해 이러한 특성에 대한 정보를 얻고, 이를 사용해 온프레미스나 다른 클라우드 공급자의 네트워크에서 실행되는 기능적으로 동등한 서버를 구성할 수 있어요.
| 특성 | 설명 |
|---|---|
| 지리적 위치 | Amazon EC2는 전 세계 모든 AWS 리전에서 호스팅돼요. 고객과 가까운 위치에 인스턴스를 선택할 수 있어요. 여러 위치에서 인스턴스를 시작할 수 있어요. |
| 하드웨어 사양 | Amazon EC2는 다양한 사용 사례에 최적화된 광범위한 인스턴스 유형을 제공해요. 인스턴스에 선택한 인스턴스 유형이 컴퓨팅, 메모리, 네트워킹, 스토리지 리소스를 결정해요. |
| 이미지 | Amazon Machine Image(AMI)에는 시작 시 인스턴스에 설치할 소프트웨어가 포함돼요. 여기에는 운영체제, 소프트웨어 패키지, 사용자 지정 구성이 포함돼요. |
| IP 주소 및 DNS 호스트 이름 | 인스턴스는 프라이빗 IP 주소와 프라이빗 DNS 호스트 이름을 받아요. 인스턴스에 공개 IP 주소를 구성하면 공개 DNS 호스트 이름도 받아요. |
| 보안 그룹 규칙 | 인스턴스와 연결된 보안 그룹 규칙이 허용되는 인바운드·아웃바운드 트래픽을 결정해요. |
| 사용자 데이터 | 사용자 데이터는 시작 시 인스턴스에 제공돼요. 셸 스크립트(Linux) 또는 PowerShell 스크립트(Windows)로 구성돼요. |
지리적 위치 (Geographic location)
Amazon EC2는 전 세계 모든 AWS 리전에서 사용할 수 있어요. 각 리전은 별도의 지리적 영역이에요. 대부분의 사용자와 가까운 서버용 리전을 선택하면 네트워크 지연 시간을 줄일 수 있어요.
Amazon EC2 Global View를 사용해 모든 리전에 걸친 Amazon EC2 인스턴스를 나열할 수 있어요. AWS Management Console과 API에서는 각 리전의 인스턴스를 개별적으로 나열해야 해요.
이것이 왜 중요한가요 (Why this matters)
인스턴스가 어디에 있는지 결정한 후에는 요구 사항에 따라 기능적으로 동등한 서버를 같은 위치나 다른 위치에 배포할지 결정할 수 있어요.
모든 리전에 걸친 EC2 인스턴스 요약을 얻으려면 (To get a summary of your EC2 instances across all Regions)
- Amazon EC2 Global View 콘솔(https://console.aws.amazon.com/ec2globalview/home)을 엽니다.
- Region explorer 탭의 Summary 아래에서 Instances의 리소스 수를 확인해요. 여기에는 인스턴스 수와 리전 수가 포함돼요. 밑줄이 있는 텍스트를 선택해 인스턴스 수가 리전에 어떻게 분포되어 있는지 확인해요.
- Global search 탭에서 클라이언트 필터 Resource type = Instance를 선택해요. 리전이나 태그를 지정해 결과를 더 필터링할 수 있어요.
AWS CLI로 리전의 EC2 인스턴스 수를 얻으려면 (To get the number of EC2 instances in a Region using the AWS CLI)
다음 describe-instances 명령을 사용해 지정된 리전의 인스턴스를 계산해요. 이 명령은 인스턴스가 있는 각 리전에서 실행해야 해요.
aws ec2 describe-instances \
--region us-east-2 \
--query "length(Reservations[*].Instances[])"
다음은 예시 출력이에요.
27
인스턴스 개수 대신 인스턴스 ID 목록을 얻으려면 다음 --query 파라미터를 대신 사용해요.
--query "Reservations[*].Instances[].InstanceId"
하드웨어 사양 (Hardware specifications)
EC2 인스턴스에 지정하는 인스턴스 유형은 해당 인스턴스에 사용 가능한 컴퓨팅, 메모리, 스토리지, 네트워킹 리소스를 결정해요. 각 인스턴스 패밀리는 컴퓨팅, 메모리, 네트워크, 스토리지 리소스의 서로 다른 균형을 제공해요. 자세한 내용은 Amazon EC2 Instance Types Guide를 참고하세요.
이것이 왜 중요한가요 (Why these matter)
인스턴스의 하드웨어 사양을 결정한 후에는 기능적으로 동등한 서버에 필요한 최소 사양을 결정할 수 있어요.
인스턴스가 사용하는 인스턴스 유형 요약을 얻으려면 (To get a summary of the instance types used by your instances)
다음 describe-instances 명령을 사용해요. sed 명령은 대괄호와 빈 줄이 있는 줄을 제거해요. 이 명령은 인스턴스가 있는 각 리전에서 실행해야 해요.
aws ec2 describe-instances \
--query "Reservations[*].Instances[].InstanceType" | sed 's/[][]//g;/^$/d' | sort | uniq -c | sort -nr
다음은 예시 출력이에요.
20 "c6i.4xlarge",
5 "t2.micro",
2 "g6e.2xlarge",
특정 인스턴스 유형에 대한 정보를 얻으려면 (To get information about specific instance types)
다음 describe-instance-types 명령을 사용해 인스턴스 유형을 설명해요. --query 파라미터는 출력에 지정된 필드만 포함해요. 이는 기본 특성이에요. 필요에 따라 추가 필드를 포함하거나 Amazon EC2 Instance Types Guide의 Amazon EC2 instance type specifications를 참조할 수 있어요.
aws ec2 describe-instance-types \
--instance-types c6i.4xlarge t2.micro g6e.2xlarge \
--query "InstanceTypes[*].[InstanceType,VCpuInfo.DefaultVCpus,MemoryInfo.SizeInMiB,NetworkInfo.NetworkPerformance]" \
--output table
다음은 예시 출력이에요. 열은 인스턴스 유형, vCPU, 메모리(GiB), 네트워크 대역폭(Gbps)이에요.
------------------------------------------------------
| DescribeInstanceTypes |
+--------------+-----+--------+----------------------+
| t2.micro | 1 | 1024 | Low to Moderate |
| c6i.4xlarge | 16 | 32768 | Up to 12.5 Gigabit |
| g6e.2xlarge | 8 | 65536 | Up to 20 Gigabit |
+--------------+-----+--------+----------------------+
이미지 (Images)
Amazon Machine Image(AMI)는 시작 시 인스턴스에 설치되는 소프트웨어(예: 운영체제, 서비스, 개발 도구, 애플리케이션)를 제공해요. AMI를 다른 서버와 함께 사용할 수 있도록 다른 형식으로 내보낼 수 있어요.
이것이 왜 중요한가요 (Why these matter)
인스턴스의 AMI를 결정한 후에는 기능적으로 동등한 서버에 필요한 이미지를 계획할 수 있어요. AMI를 다른 곳에서 사용할 수 있는 형식으로 내보낼 수도 있어요. 또는 각 AMI에서 시작한 인스턴스에 연결해 무엇이 설치되었고 어떻게 구성되었는지 확인하고, 필요한 모든 것이 복사본으로 있는지 확인해야 할 수도 있어요.
인스턴스의 AMI를 얻으려면 (To get the AMIs for your instances)
다음 describe-instances 명령을 사용해요. sed 명령은 대괄호와 빈 줄이 있는 줄을 제거해요. 이 명령은 인스턴스가 있는 각 리전에서 실행해야 해요.
aws ec2 describe-instances \
--query "Reservations[*].Instances[].ImageId" | sed 's/[][]//g;/^$/d' | sort | uniq -c | sort -nr
다음은 예시 출력이에요.
20 "ami-0a70b9d193ae8a79",
5 "ami-07d9cf938edb0739b",
2 "ami-09245d5773578a1d6",
특정 AMI에 대한 정보를 얻으려면 (To get information about specific AMIs)
다음 describe-images 명령을 사용해요. --query 파라미터는 출력에 지정된 필드만 포함해요. 필요에 따라 추가 필드를 포함할 수 있어요.
aws ec2 describe-images \
--image-id ami-0a70b9d193ae8a79 ami-07d9cf938edb0739b ami-09245d5773578a1d6 \
--query "Images[*].{ID:ImageId,CreateDate:CreationDate,Name:Name,Description:Description}"
다음은 예시 출력이에요.
[
{
"ID": "ami-0a70b9d193ae8a799",
"CreateDate": "2025-03-01T02:22:41.000Z",
"Name": "web-server-3.1",
"Description": "Image for web servers"
},
{
"ID": "ami-07d9cf938edb0739b",
"CreateDate": "2025-02-01T23:59:03.000Z",
"Name": "awesome-application-11.5",
"Description": "Image for Awesome Application"
},
{
"ID": "ami-09245d5773578a1d6",
"CreateDate": "2025-01-31T02:22:41.000Z",
"Name": "monitoring-4.2",
"Description": "Monitoring software"
}
]
AMI에서 VM 파일을 만들려면 (To create a VM file from an AMI)
export-image 명령을 사용해요. 지원되는 이미지 형식은 VHD(Citrix Xen 및 Microsoft Hyper-V와 호환), VMDK(VMware ESX 및 VMware vSphere와 호환), raw 형식(KVM 및 Xen 하이퍼바이저와 호환)이에요. VM Import/Export의 요구 사항과 제한 사항에 대한 정보는 VM Import/Export requirements를 참고하세요.
IP 주소 및 DNS 호스트 이름 (IP addresses and DNS hostnames)
사용자는 공개 DNS 호스트 이름을 사용해 인터넷을 통해 EC2 인스턴스에 연결해요. EC2 인스턴스의 공개 DNS 호스트 이름은 공개 IP 주소로 해석돼요. EC2 인스턴스는 프라이빗 IP 주소를 사용해 서로 통신할 수 있어요.
이것이 왜 중요한가요 (Why these matter)
IP 주소는 장치가 로컬 네트워크나 인터넷을 통해 서로 통신할 수 있게 해줘요. 인스턴스의 IP 주소와 DNS 이름을 기록하면 기능적으로 동등한 서버가 인스턴스와 동일한 클라이언트나 장치와 통신할 수 있도록 보장하는 데 도움이 돼요. 예를 들어 로드 밸런서 구성이나 DNS 공급자에 만든 DNS 레코드를 업데이트할 수 있어요.
인스턴스의 IP 주소와 DNS 호스트 이름을 얻으려면 (To get the IP addresses and DNS hostnames for your instances)
다음 describe-instances 명령을 사용해요. 이 명령은 인스턴스가 있는 각 리전에서 실행해야 해요. --query 파라미터는 출력에 지정된 필드만 포함해요. 필요에 따라 추가 필드를 포함할 수 있어요.
aws ec2 describe-instances \
--query "Reservations[*].Instances[].[InstanceId,PrivateIpAddress,PublicDnsName]" \
--output table
다음은 예시 출력이에요. 열은 인스턴스 ID, 프라이빗 IPv4 주소, 공개 IPv4 DNS 이름이에요.
----------------------------------------------------------------------------------------
|| DescribeInstances ||
+---------------------+------------+---------------------------------------------------+
|| i-0bac57d7472c89bac | 10.0.2.139 | ec2-192-0-2-142.us-east-2.compute.amazonaws.com ||
|| i-0fa8b7678975a3fff | 10.0.14.85 | ec2-198-51-100-56.us-east-2.compute.amazonaws.com ||
...
...
|| i-08fd74f3f1595fdbd | 10.0.1.241 | ec2-203.0.113.13.us-east-2.compute.amazonaws.com ||
+---------------------+------------+---------------------------------------------------+
보안 그룹 규칙 (Security group rules)
보안 그룹은 가상 방화벽 역할을 해요. 보안 그룹을 EC2 인스턴스에 연결한 후에는 그 규칙이 특정 포트와 프로토콜을 통한 EC2 인스턴스의 인바운드·아웃바운드 트래픽을 허용해요.
이것이 왜 중요한가요 (Why these matter)
서버에 도달하도록 허용되는 인바운드 트래픽과 서버에서 나가도록 허용되는 아웃바운드 트래픽을 결정한 후에는 기능적으로 동등한 서버에 필요한 방화벽 규칙을 계획할 수 있어요.
인스턴스의 보안 그룹을 얻으려면 (To get the security groups for your instances)
다음 describe-instances 명령을 사용해요. sed 명령은 대괄호와 빈 줄이 있는 줄을 제거해요. 이 명령은 인스턴스가 있는 각 리전에서 실행해야 해요.
aws ec2 describe-instances \
--query "Reservations[*].Instances[].SecurityGroups[].GroupId" | sed 's/[][]//g;/^$/d' | sort | uniq -c | sort -nr
다음은 예시 출력이에요.
27 "sg-01dd3383691d02f42",
10 "sg-08c77cc910c0b3b2c",
2 "sg-00f4e409629f1a42d",
보안 그룹의 인바운드 규칙을 얻으려면 (To get the inbound rules for a security group)
IsEgress가 false인 지정된 보안 그룹의 규칙을 표시하려면 다음 describe-security-group-rules 명령을 사용해요.
aws ec2 describe-security-group-rules \
--filters Name=group-id,Values=sg-01dd3383691d02f42 \
--query 'SecurityGroupRules[?IsEgress==`false`]'
다음은 예시 출력이에요. 첫 번째 규칙은 기본 인바운드 규칙으로, 이 보안 그룹에 할당된 모든 리소스에서 인바운드 트래픽을 허용해요. 다른 규칙은 지정된 프리픽스 목록의 IP 주소에서 SSH 트래픽을 허용해요. 프리픽스 목록의 CIDR 블록을 설명하려면 describe-prefix-lists 명령을 사용해요.
[
{
"SecurityGroupRuleId": "sgr-06c8b42574a91db1b",
"GroupId": "sg-01dd3383691d02f42",
"GroupOwnerId": "123456789012",
"IsEgress": false,
"IpProtocol": "-1",
"FromPort": -1,
"ToPort": -1,
"ReferencedGroupInfo": {
"GroupId": "sg-01dd3383691d02f42",
"UserId": "123456789012"
},
"Tags": [],
"SecurityGroupRuleArn": "arn:aws:ec2:us-west-2:123456789012:security-group-rule/sgr-06c8b42574a91db1b"
},
{
"SecurityGroupRuleId": "sgr-0886a5d46afcd1758",
"GroupId": "sg-01dd3383691d02f42",
"GroupOwnerId": "123456789012",
"IsEgress": false,
"IpProtocol": "tcp",
"FromPort": 22,
"ToPort": 22,
"PrefixListId": "pl-f8a6439125e7bf465",
"Tags": [],
"SecurityGroupRuleArn": "arn:aws:ec2:us-east-2:123456789012:security-group-rule/sgr-0886a5d46afcd1758"
}
]
보안 그룹의 아웃바운드 규칙을 얻으려면 (To get the outbound rules for a security group)
IsEgress가 true인 지정된 보안 그룹의 규칙을 표시하려면 다음 describe-security-group-rules 명령을 사용해요.
aws ec2 describe-security-group-rules \
--filters Name=group-id,Values=sg-01dd3383691d02f42 \
--query 'SecurityGroupRules[?IsEgress==`true`]'
다음은 예시 출력이에요. 모든 아웃바운드 IPv4 트래픽을 허용하는 기본 아웃바운드 규칙만 포함해요.
[
{
"SecurityGroupRuleId": "sgr-048f09a719247dce7",
"GroupId": "sg-01dd3383691d02f42",
"GroupOwnerId": "123456789012",
"IsEgress": true,
"IpProtocol": "-1",
"FromPort": -1,
"ToPort": -1,
"CidrIpv4": "0.0.0.0/0",
"Tags": [],
"SecurityGroupRuleArn": "arn:aws:ec2:us-east-2:123456789012:security-group-rule/sgr-048f09a719247dce7"
}
]
사용자 데이터 (User data)
EC2 인스턴스를 시작할 때 사용자 데이터를 사용해 셸 스크립트를 인스턴스에 전달할 수 있어요. 사용자 데이터는 base64로 인코딩되므로 스크립트를 읽으려면 사용자 데이터를 디코딩해야 해요.
이것이 왜 중요한가요 (Why this matters)
인스턴스 설정의 일부로 시작 시 명령을 실행하고 있다면, 기능적으로 동등한 서버를 설정할 때도 동일한 작업을 수행해야 할 수 있어요.
인스턴스의 디코딩된 사용자 데이터를 보려면 (To view the decoded user data for an instance)
다음 describe-instance-attribute 명령을 사용해요. base64 명령이 사용자 데이터를 디코딩해요.
aws ec2 describe-instance-attribute \
--instance-id i-1234567890abcdef0 \
--attribute userData \
--output text \
--query "UserData.Value" | base64 --decode
다음은 예시 출력이에요.
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
관련 리소스 (Related resources)
다음은 EC2 인스턴스의 추가 특성이에요.
- 키 페어(Key pairs)
- 스토리지(Storage)
- 태그(Tags)
EC2 인스턴스를 시작하거나 EC2 인스턴스 간 트래픽을 분산하기 위해 다음을 사용하고 있는지 확인할 수 있어요.
- Auto Scaling 그룹
- EC2 Fleet
- Elastic Load Balancing