amazon-web-services - 使用 CustomResource 调用 Lambda
问题描述
在创建 CloudFormation 堆栈时,我创建了一个 CustomResource 来调用 lambda 函数。它失败并出现以下错误:
Received response status [FAILED] from custom resource. Message returned: User: arn:aws:sts::<account>:assumed-role/stack-role is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:<account>:function:<lambda> because no identity-based policy allows the lambda:InvokeFunction action
这是 CDK 中的代码:
import * as cr from '@aws-cdk/custom-resources';
const callLambda = new cr.AwsCustomResource(this, 'MyCustomResource', {
onCreate: {
service: 'Lambda',
action: 'invoke',
region: 'us-east-1',
physicalResourceId: cr.PhysicalResourceId.of(Date.now.toString()),
parameters: {
FunctionName: `my-function`,
Payload: '{}'
},
},
policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
})
});
如何向堆栈的假定角色授予权限,以便它可以执行 lambda:InvokeFunction?
解决方案
我通过创建一个承担 lambda 服务主体的角色并添加一个允许 lambda:InvokeFunction 的策略语句解决了这个问题。
import * as cr from '@aws-cdk/custom-resources';
import * as iam from "@aws-cdk/aws-iam";
let role = new iam.Role(this, `my-role`, {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
});
role.addToPolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ['lambda:InvokeFunction'],
resources: ['*']
}));
const callLambda = new cr.AwsCustomResource(this, 'MyCustomResource', {
onCreate: {
service: 'Lambda',
action: 'invoke',
region: 'us-east-1',
physicalResourceId: cr.PhysicalResourceId.of(Date.now.toString()),
parameters: {
FunctionName: `my-function`,
Payload: '{}'
},
},
policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
}),
role: role as any
});
推荐阅读
- r - 试图在 R 中绘制散点图,但很难找到要绘制的月降雨量和月平均湿度的总和
- c# - 如何使用 EWS 连接到 Exchange 子帐户?
- tensorflow - mobilenet V1的训练后量化不起作用
- php - laravel如何通过多个表单向多个表中插入数据
- javascript - 如何在 JavaScript 中同时使用 id 和 class?
- python-3.x - 如何使用 Python 将文本文件读入列表
- r - R中的循环问题(找到解决方案)
- javascript - Vuejs从数组中删除元素不能完全删除它
- meteor - 如何在 Phusion Passenger 上部署流星?
- php - Laravel,如何使用 groupby 显示产品标题及其相关项目