# IMDSv1
curl http://169.254.169.254/latest/dynamic/instance-identity/document

# IMDSv2
TOKEN=`curl -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` -X PUT "http://169.254.169.254/latest/api/token" 
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document

{
    "accountId": "",
    "architecture": "arm64",
    "availabilityZone": "ap-northeast-2c",
    "billingProducts": null,
    "devpayProductCodes": null,
    "marketplaceProductCodes": null,
    "imageId": "ami-0331a5c9d849893dc",
    "instanceId": "",
    "instanceType": "c6g.xlarge",
    "kernelId": null,
    "pendingTime": "2024-06-23T01:01:23Z",
    "privateIp": "192.169.44.196",
    "ramdiskId": null,
    "region": "ap-northeast-2",
    "version": "2017-09-30"
}

์ธ์Šคํ„ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ํ™œ์šฉํ•ด์„œ ๋™์  ๋ฐ์ดํ„ฐ์˜ ์ธ์Šคํ„ด์Šค ์ž๊ฒฉ ์ฆ๋ช… ๋ฌธ์„œ(instance-identity/document)๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” AWS SDK for Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” EC2 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด AWS EC2 ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ EC2 ์ธ์Šคํ„ด์Šค ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ ์•ก์ถ”์—์ดํ„ฐ์˜ InfoContributor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ EC2MetadataInfoContributor๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

EC2MetadataInfoContributor with SDK for Java 1.x

build.gradle
dependencies { // the AWS SDK for Java v1.x will enter maintenance mode on July 31, 2024, and reach end-of-support on December 31, 2025. implementation platform('com.amazonaws:aws-java-sdk-bom:1.12.748') implementation 'com.amazonaws:aws-java-sdk-ec2' }
EC2MetadataInfoContributor.java
import com.amazonaws.util.EC2MetadataUtils; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.stereotype.Component; @Component public class EC2MetadataInfoContributor implements InfoContributor { private final boolean isRunningAwsEC2; public EC2MetadataInfoContributor() { isRunningAwsEC2 = EC2MetadataUtils.getInstanceId() != null; } @Override public void contribute(Info.Builder builder) { if (isRunningAwsEC2) { EC2MetadataUtils.InstanceInfo instanceInfo = EC2MetadataUtils.getInstanceInfo(); builder.withDetail("ec2", instanceInfo); } } }

EC2MetadataInfoContributor with SDK for Java 2.x

build.gradle
dependencies { implementation platform('software.amazon.awssdk:bom:2.21.4') implementation 'software.amazon.awssdk:imds' implementation 'software.amazon.awssdk:url-connection-client' }
EC2MetadataInfoContributorV2.java
mport org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.stereotype.Component; import software.amazon.awssdk.core.document.Document; import software.amazon.awssdk.imds.Ec2MetadataClient; import software.amazon.awssdk.imds.Ec2MetadataResponse; @Component public class EC2MetadataInfoContributorV2 implements InfoContributor { private boolean isRunningAwsEC2; public EC2MetadataInfoContributorV2() { try (Ec2MetadataClient client = Ec2MetadataClient.create()) { isRunningAwsEC2 = client.get("/latest/meta-data/instance-id").asString() != null; } catch (Exception ignored) { // ignored } } @Override public void contribute(Info.Builder builder) { if (isRunningAwsEC2) { try (Ec2MetadataClient client = Ec2MetadataClient.create()) { Ec2MetadataResponse metadataResponse = client.get("/latest/dynamic/instance-identity/document"); Document document = metadataResponse.asDocument(); builder.withDetail("ec2", document.asMap()); } catch (Exception ignored) { // ignored } } } }

์ธ์Šคํ„ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰

  1. SDK ๋ฒ„์ „์— ๋”ฐ๋ผ SDK๊ฐ€ ์—”๋“œํฌ์ธํŠธ๋ฅผ IMDS๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ™•์ธํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค.
  2. Java 2.x๋Š” IMDSv2๋งŒ ์ง€์›ํ•˜์ง€๋งŒ Java 1.x๋Š” IMDSv2 ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„๋•Œ IMDSv1 ์œผ๋กœ๋„ ์กฐํšŒํ•œ๋‹ค.
  3. Java 2.x๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง์ ‘ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค.
  4. Java 1.x๋Š” 2025๋…„ 12์›” 31์ผ ์ง€์› ์ข…๋ฃŒ(End of support)๋œ๋‹ค.