我想使用aws-java-sdk在我的Java应用程序中调用AWS Lambda函数。
如以下代码所示。
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资源的安全访问权限比手动输入访问密钥更为方便。为了尝试在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/
我想知道;
答案 0 :(得分:0)
正确的方法是
将带有lambda调用策略的instance profile附加到ec2实例。然后使用Aws sdk而不显式指定任何ak / sk。该SDK可以正确地从元数据中获取临时令牌。