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
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'
}
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
dependencies {
implementation platform('software.amazon.awssdk:bom:2.21.4')
implementation 'software.amazon.awssdk:imds'
implementation 'software.amazon.awssdk:url-connection-client'
}
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
}
}
}
}
μΈμ€ν΄μ€ λ©νλ°μ΄ν° κ²μ
- SDK λ²μ μ λ°λΌ SDKκ° μλν¬μΈνΈλ₯Ό IMDSλ‘ νμΈνκΈ° μν΄ νμΈνλ μμΉκ° λ€λ₯΄λ€.
- Java 2.xλ IMDSv2λ§ μ§μνμ§λ§ Java 1.xλ IMDSv2 λ₯Ό μ¬μ©ν μ μμλ IMDSv1 μΌλ‘λ μ‘°ννλ€.
- Java 2.xλ μΈμ€ν΄μ€ λ©νλ°μ΄ν° μΉ΄ν κ³ λ¦¬λ₯Ό μ§μ λͺ μν΄μΌνλ€.
- Java 1.xλ 2025λ 12μ 31μΌ μ§μ μ’ λ£(End of support)λλ€.