我正在尝试适应 AWS 的 Java SDK,但未能完成一些基本的工作。该代码应该执行以下操作:
代码无法正确部署所需的资源,因为 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,但我宁愿避免这种情况。
非常感谢您可以帮助我的任何事情!
看来您可能需要调整您的订单。 Java 中的 AWS 代码示例库中有一个用于 IAM 的示例,它可以创建角色并添加策略,并且在创建资源后有 30 秒的等待时间。也许您还想捕获“未找到角色”异常(如果有)并再次等待并重试。但即使等待,您也需要以下订单之一: