EC2 메타데이터 유틸리티가 버전 1에서 버전 2로 변경됨 - AWS SDK for Java 2.x

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

EC2 메타데이터 유틸리티가 버전 1에서 버전 2로 변경됨

이 주제에서는 버전 1(v1EC2)에서 버전 2(v2)로의 Java Amazon Elastic Compute Cloud() 메타데이터 유틸리티에 SDK 대한 변경 사항을 자세히 설명합니다.

높은 수준의 변경 사항

변경 사항 v1 v2

Maven 종속성

<dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>1.12.5871</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-core</artifactId> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.27.212</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>imds</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client3</artifactId> </dependency> </dependencies>
패키지 이름 com.amazonaws.util software.amazon.awssdk.imds
인스턴스화 접근 방식

인스턴스화 없이 정적 유틸리티 메서드 사용:

String localHostName = EC2MetadataUtils.getLocalHostName();

정적 팩토리 메서드 사용:

Ec2MetadataClient client = Ec2MetadataClient.create();

또는 빌더 접근 방식 사용:

Ec2MetadataClient client = Ec2MetadataClient.builder() .endpointMode(EndpointMode.IPV6) .build();
클라이언트 유형 동기 전용 유틸리티 메서드: EC2MetadataUtils

동기식: Ec2MetadataClient

비동기식: Ec2MetadataAsyncClient

1 최신 버전. 2 최신 버전.

3v2에 대한 apache-client 모듈 선언에 주목합니다. EC2 메타데이터 유틸리티의 V2를 사용하려면 동기 메타데이터 클라이언트의 SdkHttpClient 인터페이스 또는 비동기 메타데이터 클라이언트의 SdkAsyncHttpClient 인터페이스를 구현해야 합니다. 이 HTTP 클라이언트 섹션에는 사용할 수 있는 HTTP 클라이언트 목록이 표시됩니다.

메타데이터 요청

v1에서는 파라미터를 수락하지 않는 정적 메서드를 사용하여 EC2 리소스에 대한 메타데이터를 요청합니다. 반대로 EC2 리소스의 경로를 v2의 파라미터로 지정해야 합니다. 다음 표는 서로 다른 접근 방식을 보여줍니다.

v1 v2
String userMetaData = EC2MetadataUtils.getUserData();
Ec2MetadataClient client = Ec2MetadataClient.create(); Ec2MetadataResponse response = client.get("/latest/user-data"); String userMetaData = response.asString();

인스턴스 메타데이터 범주를 참조하여 메타데이터를 요청하기 위해 제공해야 하는 경로를 찾으세요.

참고

v2에서 인스턴스 메타데이터 클라이언트를 사용하는 경우, 메타데이터를 검색하는 모든 요청에 동일한 클라이언트를 사용해야 합니다.

동작 변경 사항

JSON 데이터

에서 로컬EC2에서 실행되는 인스턴스 메타데이터 서비스(IMDS)는 일부 메타데이터를 JSON 형식이 지정된 문자열로 반환합니다. 그러한 예로 인스턴스 ID 문서의 동적 메타데이터를 들 수 있습니다.

v1에는 인스턴스 자격 증명 메타데이터의 각 부분에 대한 별도의 메서드가 API 포함된 반면 v2는 JSON 문자열을 API 직접 반환합니다. JSON 문자열로 작업하려면 문서를 사용하여 응답을 API 구문 분석하고 JSON 구조를 탐색할 수 있습니다.

다음 표는 v1과 v2에서 인스턴스 ID 문서의 메타데이터를 검색하는 방법을 비교한 것입니다.

사용 사례 v1 v2
리전 검색
InstanceInfo instanceInfo = EC2MetadataUtils.getInstanceInfo(); String region = instanceInfo.getRegion();
Ec2MetadataResponse response = client.get("/latest/dynamic/instance-identity/document"); Document instanceInfo = response.asDocument(); String region = instanceInfo.asMap().get("region").asString();
인스턴스 ID 검색
InstanceInfo instanceInfo = EC2MetadataUtils.getInstanceInfo(); String instanceId = instanceInfo.instanceId;
Ec2MetadataResponse response = client.get("/latest/dynamic/instance-identity/document"); Document instanceInfo = response.asDocument(); String instanceId = instanceInfo.asMap().get("instanceId").asString();
인스턴스 유형 검색
InstanceInfo instanceInfo = EC2MetadataUtils.getInstanceInfo(); String instanceType = instanceInfo.instanceType();
Ec2MetadataResponse response = client.get("/latest/dynamic/instance-identity/document"); Document instanceInfo = response.asDocument(); String instanceType = instanceInfo.asMap().get("instanceType").asString();

엔드포인트 해상도 차이

다음 표에는 가 엔드포인트를 로 해결하기 위해 SDK 확인하는 위치가 나와 있습니다IMDS. 위치는 내림차순으로 나열됩니다.

v1 v2
시스템 속성: com.amazonaws.sdk.ec2MetadataServiceEndpointOverride 클라이언트 빌더 구성 메서드: endpoint(...)
환경 변수: AWS_EC2_METADATA_SERVICE_ENDPOINT 시스템 속성: aws.ec2MetadataServiceEndpoint
Default Value: http://169.254.169.254 구성 파일: ec2_metadata_service_endpoint 설정이 포함된 ~.aws/config
확인된 endpoint-mode 관련된 값
기본 값: http://169.254.169.254

v2의 엔드포인트 해상도

빌더를 사용하여 엔드포인트를 명시적으로 설정하면 해당 엔드포인트 값이 다른 모든 설정보다 우선합니다. 다음 코드가 실행될 때 aws.ec2MetadataServiceEndpoint 시스템 속성 및 구성 파일 ec2_metadata_service_endpoint 설정이 있는 경우 무시됩니다.

Ec2MetadataClient client = Ec2MetadataClient .builder() .endpoint(URI.create("endpoint.to.use")) .build();

엔드포인트 모드

v2를 사용하면 엔드포인트 모드를 지정하여 IPv4 또는 의 기본 엔드포인트 값을 사용하도록 메타데이터 클라이언트를 구성할 수 있습니다IPv6. v1에는 엔드포인트 모드를 사용할 수 없습니다. 에 사용되는 기본값IPv4은 http://169.254.169.254http://[fd00:ec2::254]입니다IPv6.

다음 표는 우선 순위가 내려가는 순서대로 엔드포인트 모드를 설정할 수 있는 다양한 방법을 보여줍니다.

가능한 값
클라이언트 빌더 구성 메서드: endpointMode(...)
Ec2MetadataClient client = Ec2MetadataClient .builder() .endpointMode(EndpointMode.IPV4) .build();
EndpointMode.IPV4, EndpointMode.IPV6
시스템 속성 aws.ec2MetadataServiceEndpointMode IPv4, IPv6(대/소문자를 구분하지 않음)
Config 파일: ~.aws/config ec2_metadata_service_endpoint 설정 IPv4, IPv6(대/소문자를 구분하지 않음)
이전 방법으로는 지정되지 않음 IPv4 가 사용됩니다.

v2endpoint-mode에서 endpoint 또는 가 SDK 해결되는 방법

  1. 는 클라이언트 빌더의 코드에서 설정한 값을 SDK 사용하고 외부 설정을 무시합니다. endpointMode 는 클라이언트 빌더에서 endpoint 및 를 모두 호출하는 경우 예외를 SDK 발생시키기 때문에 는 사용하는 메서드의 엔드포인트 값을 SDK 사용합니다.

  2. 코드에서 값을 설정하지 않으면 는 외부 구성을 SDK 찾습니다. 먼저 시스템 속성을 찾은 다음 구성 파일의 설정을 찾습니다.

    1. 첫 SDK 번째는 엔드포인트 값을 확인합니다. 값이 발견되면 해당 값이 사용됩니다.

    2. 가 SDK 여전히 값을 찾지 못한 경우 는 엔드포인트 모드 설정을 SDK 찾습니다.

  3. 마지막으로 가 외부 설정을 SDK 찾지 못하고 코드에서 메타데이터 클라이언트를 구성하지 않은 경우 는 IPv4 값을 SDK 사용합니다http://169.254.169.254.

IMDSv2

Amazon은 인스턴스 메타데이터에 액세스하는 두 가지 접근 방식을 EC2 정의합니다.

  • 인스턴스 메타데이터 서비스 버전 1(IMDSv1) – 요청/응답 접근 방식

  • 인스턴스 메타데이터 서비스 버전 2(IMDSv2) - 세션 지향적 접근 방식

다음 표에서는 Java가 와 SDKs 작동하는 방식을 비교합니다IMDS.

v1 v2
IMDSv2 는 기본적으로 사용됩니다. 항상 사용 IMDSv2
각 요청에 대한 세션 토큰을 가져오려고 시도하고 세션 토큰을 가져오지 IMDSv1 못하면 로 돌아갑니다. 여러 요청에 재사용되는 세션 토큰을 내부 캐시에 보관합니다.

Java 2.xSDK용 는 만 지원IMDSv2하며 로 되돌아가지 않습니다IMDSv1.

구성 차이점

다음 표에는 다양한 구성 옵션이 나와 있습니다.

구성 v1 v2
재시도 구성을 사용할 수 없음 빌더 메서드 retryPolicy(...)를 통해 구성할 수 있습니다.
HTTP 연결 시간 제한은 AWS_METADATA_SERVICE_TIMEOUT 환경 변수를 통해 구성할 수 있습니다. 기본값은 1초입니다. HTTP 클라이언트를 빌더 메서드 에 전달하여 구성을 사용할 수 있습니다httpClient(...). HTTP 클라이언트의 기본 연결 제한 시간은 2초입니다.

예제 v2 HTTP 구성

다음 예제는 메타데이터 클라이언트를 구성하는 방법을 보여줍니다. 이 예제에서는 연결 제한 시간을 구성하고 Apache HTTP 클라이언트를 사용합니다.

SdkHttpClient httpClient = ApacheHttpClient.builder() .connectionTimeout(Duration.ofSeconds(1)) .build(); Ec2MetadataClient imdsClient = Ec2MetadataClient.builder() .httpClient(httpClient) .build();