AWS Java SDK:创建角色和 Lambda,Lambda 无法承担角色

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

我正在尝试适应 AWS 的 Java SDK,但未能完成一些基本的工作。该代码应该执行以下操作:

  • 将 zip 文件上传到 s3 存储桶
  • 为 lambda 创建执行角色
  • 使用上传的 zip 中的代码创建 lambda 并创建角色
  • 为 lambda 执行角色分配策略

代码无法正确部署所需的资源,因为 Lambda 无法承担该角色。

请在下面找到我正在使用的代码。各种客户端均已正确初始化。此外:

  • bucketName
    是现有 S3 存储桶的有效名称
  • objectKey
    是 S3 密钥的有效名称,
    bucketName
    存储桶
  • 中没有与此名称匹配的现有密钥
  • zipFile
    File
    指向包含 AWS Lambda 函数处理程序代码的有效且现有的 zip 文件
  • lambdaAssume
    是一个
    String
    ,包含 lambda 的假设角色策略,如 AWS 文档中所述,其内容显示在代码后面
  • policyArn
    是现有策略的有效 ARN
s3Client.putObject(PutObjectRequest.builder()
    .bucket(bucketName)
    .key(objectKey)
    .build(),
  RequestBody.fromFile(zipFile));

Role execRole = iamClient.createRole(CreateRoleRequest.builder()
    .roleName("my-new-lambda-exec-role")
    .assumeRolePolicyDocument(lambdaAssume)
    .build
  ).role();

lambdaClient.createFunction(CreateFunctionRequest.builder()
    .functionName("my-new-lambda")
    .packageType(PackageType.ZIP)
    .code(FunctionCode.builder()
      .s3Bucket(bucketName)
      .s3Key(objectKey)
      .build())
    .role(execRole.arn())
    .handler("org.acme.App::handleRequest")
    .runtime(Runtime.JAVA11)
    .architectures(Architecture.X86_64)
    .build());

iamClient.attachRolePolicy(AttachRolePolicyRequest.builder()
    .roleName(execRole.roleName())
    .policyArn(policyArn)
    .build());

其中

lambdaAssume
如下:

"""
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
"""

代码执行失败,出现以下错误:

Exception in thread "main" software.amazon.awssdk.services.lambda.model.InvalidParameterValueException: The role defined for the function cannot be assumed by Lambda. (Service: Lambda, Status Code: 400, Request ID: ...)

有人可以看一下代码并告诉我是否从中得到任何东西吗?我也尝试让一个服务员来创建这个角色,但没有任何改变。我在 aws 控制台上读到,创建 lambda 时,可能需要长达 5 分钟才能使新创建的执行角色正常工作,并且在此期间最好不要修改它。这也适用于 SDK 的情况吗? (如果是的话,那不是很麻烦吗?而且我如何检测角色何时可以修改?)

请注意,目标是避免通过控制台手动创建资源,这意味着理想情况下一切都是通过 sdk 完成的,可以使用 cli,但我宁愿避免这种情况。

非常感谢您可以帮助我的任何事情!

amazon-web-services aws-lambda aws-sdk amazon-iam aws-sdk-java-2.0
1个回答
0
投票

看来您可能需要调整您的订单。 Java 中的 AWS 代码示例库中有一个用于 IAM 的示例,它可以创建角色并添加策略,并且在创建资源后有 30 秒的等待时间。也许您还想捕获“未找到角色”异常(如果有)并再次等待并重试。但即使等待,您也需要以下订单之一:

    一步创建带有策略的角色。
  1. 等待角色准备好。
  2. 创建您的函数。

    创建角色。
  1. 等待角色准备好。
  2. 附上政策。
  3. 创建您的函数。
库中还有一个 Lambda 示例

,但它使用预先存在的角色,因此与您的场景不完全匹配。

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