AWS EC2 ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ
# 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.gradledependencies { // 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.javaimport 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.gradledependencies { implementation platform('software.amazon.awssdk:bom:2.21.4') implementation 'software.amazon.awssdk:imds' implementation 'software.amazon.awssdk:url-connection-client' }
EC2MetadataInfoContributorV2.javamport 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 } } } }
์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ๊ฒ์
- SDK ๋ฒ์ ์ ๋ฐ๋ผ SDK๊ฐ ์๋ํฌ์ธํธ๋ฅผ IMDS๋ก ํ์ธํ๊ธฐ ์ํด ํ์ธํ๋ ์์น๊ฐ ๋ค๋ฅด๋ค.
- Java 2.x๋ IMDSv2๋ง ์ง์ํ์ง๋ง Java 1.x๋ IMDSv2 ๋ฅผ ์ฌ์ฉํ ์ ์์๋ IMDSv1 ์ผ๋ก๋ ์กฐํํ๋ค.
- Java 2.x๋ ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ง์ ๋ช ์ํด์ผํ๋ค.
- Java 1.x๋ 2025๋ 12์ 31์ผ ์ง์ ์ข ๋ฃ(End of support)๋๋ค.