【问题标题】:Get credential provider to invoke AWS Lambda functions when the JAVA application is hosted in AWS EC2 instance当 JAVA 应用程序托管在 AWS EC2 实例中时,获取凭证提供程序以调用 AWS Lambda 函数
【发布时间】:2020-02-21 15:49:11
【问题描述】:

我想使用 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. 错误信息的原因

【问题讨论】:

  • 您在使用 Amazon Linux 吗?
  • 是的。 (ubuntu 18.04)
  • 当您 ssh 进入该 EC2 实例并运行 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ 时会发生什么?您的代码是否在 EC2 实例的 docker 容器中运行?
  • 它返回 <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>404 - Not Found</title> </head> <body> <h1>404 - Not Found</h1> </body> </html> 不,我没有使用 docker 容器

标签: amazon-web-services amazon-ec2 aws-lambda aws-sdk amazon-iam


【解决方案1】:

正确的做法是,

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

【讨论】:

  • 你能提供示例代码吗?尽管我仍然有一个具有 lambda 完全访问权限的角色,但我是否应该使用 lambda 调用策略创建另一个 IAM 角色?元数据是否通过创建该角色而更新?
  • 另外,以下链接帮助我附加了实例配置文件。 docs.aws.amazon.com/IAM/latest/UserGuide/…
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2021-01-23
  • 2018-06-29
  • 2023-03-18
  • 2016-04-14
相关资源
最近更新 更多