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

问题描述 投票:2回答:1

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

  1. 访问密钥和安全密钥在awsCredentials中给出
  2. ARN和有效负载在invokeRequest中给出>
  3. 如下面的代码。

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. 错误消息的原因

我想使用aws-java-sdk在我的Java应用程序中调用AWS Lambda函数。当在aws中给出访问密钥和安全密钥时,可能会在...中给出ARN和有效载荷。...]

amazon-web-services amazon-ec2 aws-lambda aws-sdk amazon-iam
1个回答
-1
投票

正确的方法是,

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

© www.soinside.com 2019 - 2024. All rights reserved.