단일 요청으로 시작된 각 인스턴스 식별하기

단일 요청으로 시작된 각 인스턴스 식별하기 (Identify each instance launched in a single request)

이 예시는 user data와 인스턴스 메타데이터를 모두 사용해 Amazon EC2 인스턴스를 구성하는 방법을 보여줘요.

출처: 문서

본문

참고 이 섹션의 예시는 IMDS의 IPv4 주소인 169.254.169.254를 사용해요. EC2 인스턴스에 대한 인스턴스 메타데이터를 IPv6 주소로 검색한다면 IPv6 주소인 [fd00:ec2::254]를 활성화하고 대신 사용해야 해요. IMDS의 IPv6 주소는 IMDSv2 명령과 호환돼요. IPv6 주소는 IPv6를 지원하는 서브넷(듀얼 스택 또는 IPv6 전용)의 Nitro 기반 인스턴스에서만 접근할 수 있어요.

Alice는 좋아하는 데이터베이스 AMI의 인스턴스 4개를 시작하려고 해요. 첫 번째는 원본 인스턴스 역할을 하고 나머지 세 개는 복제본 역할을 해요. 시작할 때 각 복제본의 복제 전략에 대한 user data를 추가하려고 해요. 이 데이터가 네 인스턴스 모두에서 사용 가능하다는 것을 알고 있으므로, 각 인스턴스가 자신에게 적용되는 부분을 인식할 수 있도록 user data를 구성해야 해요. 이 작업은 각 인스턴스에 대해 고유한 ami-launch-index 인스턴스 메타데이터 값을 사용해 할 수 있어요. 한 번에 둘 이상의 인스턴스를 시작하면 ami-launch-index는 인스턴스가 시작된 순서를 나타내요. 첫 번째로 시작된 인스턴스의 값은 0이에요.

Alice가 구성한 user data는 다음과 같아요.

replicate-every=1min | replicate-every=5min | replicate-every=10min

replicate-every=1min 데이터는 첫 번째 복제본의 구성을 정의하고, replicate-every=5min은 두 번째 복제본의 구성을 정의하는 식이에요. Alice는 이 데이터를 파이프 기호(|)로 인스턴스별 데이터를 구분하는 ASCII 문자열로 제공하기로 결정했어요.

Alice는 run-instances 명령으로 user data를 지정해 인스턴스 4개를 시작해요.

aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --count 4 \
    --instance-type t2.micro \
    --user-data "replicate-every=1min | replicate-every=5min | replicate-every=10min"

시작 후 모든 인스턴스에는 user data 사본과 다음에 표시된 공통 메타데이터가 있어요.

  • AMI ID: ami-0abcdef1234567890
  • Reservation ID: r-1234567890abcabc0
  • Public keys: none
  • Security group name: default
  • Instance type: t2.micro

하지만 각 인스턴스에는 다음 표와 같이 고유한 메타데이터가 있어요.

Metadata Value
instance-id i-1234567890abcdef0
ami-launch-index 0
public-hostname ec2-203-0-113-25.compute-1.amazonaws.com
public-ipv4 67.202.51.223
local-hostname ip-10-251-50-12.ec2.internal
local-ipv4 10.251.50.35
Metadata Value
instance-id i-0598c7d356eba48d7
ami-launch-index 1
public-hostname ec2-67-202-51-224.compute-1.amazonaws.com
public-ipv4 67.202.51.224
local-hostname ip-10-251-50-36.ec2.internal
local-ipv4 10.251.50.36
Metadata Value
instance-id i-0ee992212549ce0e7
ami-launch-index 2
public-hostname ec2-67-202-51-225.compute-1.amazonaws.com
public-ipv4 67.202.51.225
local-hostname ip-10-251-50-37.ec2.internal
local-ipv4 10.251.50.37
Metadata Value
instance-id i-1234567890abcdef0
ami-launch-index 3
public-hostname ec2-67-202-51-226.compute-1.amazonaws.com
public-ipv4 67.202.51.226
local-hostname ip-10-251-50-38.ec2.internal
local-ipv4 10.251.50.38

Alice는 ami-launch-index 값을 사용해 특정 인스턴스에 적용되는 user data 부분을 결정할 수 있어요.

  1. 인스턴스 중 하나에 연결하고 해당 인스턴스의 ami-launch-index를 검색해서 복제본 중 하나인지 확인해요.
IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/meta-data/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-launch-index
2
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-launch-index
2

다음 단계에서 IMDSv2 요청은 토큰이 만료되지 않았다고 가정하고 앞선 IMDSv2 명령에서 저장된 토큰을 사용해요. 2. ami-launch-index를 변수로 저장해요.

IMDSv2
[ec2-user ~]$ ami_launch_index=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-launch-index`
IMDSv1
[ec2-user ~]$ ami_launch_index=`curl http://169.254.169.254/latest/meta-data/ami-launch-index`
  1. user data를 변수로 저장해요.
IMDSv2
[ec2-user ~]$ user_data=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data`
IMDSv1
[ec2-user ~]$ user_data=`curl http://169.254.169.254/latest/user-data`
  1. 마지막으로 Alice는 cut 명령을 사용해 해당 인스턴스에 적용되는 user data 부분을 추출해요.
IMDSv2
[ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index"
replicate-every=5min
IMDSv1
[ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index"
replicate-every=5min

더 알아보기 (Learn more)