我想使用 aws-java-sdk 在我的 java 应用程序中调用 AWS Lambda 函数。当
- 访问 key 和安全 key 在 awsCredentials 中给出
- ARN 和 payload 在 invokeRequest 中给出
如以下代码所示。
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
.withCredentials(credentialsProvider)
.build();
InvokeRequest invokeRequest = new InvokeRequest()
.withFunctionName(resourceName)
.withPayload(payload)
.withInvocationType(InvocationType.RequestResponse);
InvokeResult invokeResult = awsLambda.invoke(invokeRequest);
根据 AWS 文档 https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/java-dg-roles.html ,如果我的 java 应用程序托管在 Amazon EC2 实例中,则从 Amazon EC2 实例授予对 AWS 资源的安全访问权限比手动输入访问 key 更方便。为了尝试,我在 EC2 实例中托管的 Java 应用程序中实现了以下修改后的代码。
InstanceProfileCredentialsProvider credentialsProvider = InstanceProfileCredentialsProvider.getInstance();
AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
.withCredentials(credentialsProvider)
.build();
InvokeRequest invokeRequest = new InvokeRequest()
.withFunctionName(resourceName)
.withPayload(payload)
.withInvocationType(InvocationType.RequestResponse);
InvokeResult invokeResult = awsLambda.invoke(invokeRequest);
但它返回以下错误
com.amazonaws.SdkClientException: The requested metadata is not found at http://169.254.169.254/latest/meta-data/iam/security-credentials/
我想知道;
- 我的生成凭据的方法是否正确
- 如果错了,正确的做法
- 错误信息的原因
最佳答案
正确的做法是,
附上 instance profile使用 lambda 调用 ec2 实例的策略。然后在不明确指定任何 ak/sk 的情况下使用 Aws sdk。 SDK 可以从元数据中正确获取临时 token 。
关于amazon-web-services - 当 JAVA 应用程序托管在 AWS EC2 实例中时,获取凭证提供程序以调用 AWS Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58556028/