当 JAVA 应用程序托管在 AWS EC2 实例中时,获取凭证提供程序以调用 AWS Lambda 函数

Get credential provider to invoke AWS Lambda functions when the JAVA application is hosted in AWS EC2 instance

我想使用 aws-java-sdk 在我的 java 应用程序中调用 AWS Lambda 函数。在

时是可能的
  1. 访问密钥和安全密钥在 awsCredentials 中给出
  2. ARN 和负载在 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 资源的安全访问权限比手动输入访问密钥更方便.为了尝试,我在 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/

我想知道;

  1. 我的生成凭据的方法是否正确
  2. 如果错了,正确的做法
  3. 错误消息的原因

正确的做法是,

将带有 lambda 调用策略的 instance profile 附加到 ec2 实例。然后使用 Aws sdk 而不明确指定任何 ak/sk。 SDK 可以从元数据中正确获取临时令牌。