在EC2上运行时,可以通过curl命令访问访问密钥和密钥
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<rolename>
这些凭据不是常量并且不断变化。
我想知道是否有办法使用aws-java-sdk
获取这些凭据?
我知道可以做using boto3 in python。但是不知道如何在java中完成相同的工作。
答案 0 :(得分:4)
是的,通过EC2MetadataUtils.getIAMSecurityCredentials()
EC2MetadataUtils是您通过curl访问的元数据服务的Java适配器,并在EC2MetadataUtils.IAMSecurityCredential
中公开这些字段。
<强>签名:强>
public static class EC2MetadataUtils.IAMSecurityCredential
<强>字段:强>
String accessKeyId
String secretAccessKey
要访问这些字段,请使用EC2MetadataUtils.getIAMSecurityCredentials()
:
public static Map<String,EC2MetadataUtils.IAMSecurityCredential> getIAMSecurityCredentials()
<强>文档强>
这超出了本问题的范围,但值得注意的是,如果您在此实例上使用AWS SDK for Java的这些凭据,则不需要明确定义这些凭据 - AWS客户端使用默认构造函数将搜索这些凭据作为默认凭据提供程序链的一部分。有关this documentation的更多信息。
答案 1 :(得分:0)
这是一个工作示例
// This prints the EC2 instance role and then the keys
void printCredentials() {
Map<String,EC2MetadataUtils.IAMSecurityCredential> credMap = EC2MetadataUtils.getIAMSecurityCredentials();
Iterator<Map.Entry<String,EC2MetadataUtils.IAMSecurityCredential>> it = credMap.entrySet().iterator();
while (it.hasNext()) {
// First print the role associated with this instance
Map.Entry<String,EC2MetadataUtils.IAMSecurityCredential> pair = (Map.Entry<String,EC2MetadataUtils.IAMSecurityCredential>)it.next();
System.out.println("Role: " + pair.getKey() + " = Value: " + pair.getValue());
// Next print the access key and secret key
EC2MetadataUtils.IAMSecurityCredential cred = pair.getValue();
System.out.println("Access key: " + cred.accessKeyId + ", Secret key: " + cred.secretAccessKey);
}
}