我对AWS CDK相当陌生,并且对AWS没有太多经验。在我正在编写的CDK堆栈中,我必须授予使用其他CDK模板构建且已经在aws中的资源的权限。
可以说,我的堆栈A包含一个lambda,该lambda将被另一个服务X调用。服务X需要具有lambda的调用权限。我可以从服务栈A代码中授予服务X许可,还是需要修改服务X堆栈?
答案 0 :(得分:3)
通常,答案是肯定的,您可以为在堆栈外部创建的资源添加权限。但是,您需要确保资源可导入。
Lambda用法:
为lambda角色添加策略:
更多信息here。
const importedLambda = lambda.Function.fromFunctionArn(scope,`${name}-lambda`,${LAMBDA_ARN});
importedLambda.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW, // ... and so on defining the policy
}));
向lambda添加权限:
更多信息here。
const importedLambda = lambda.Function.fromFunctionArn(scope,`${name}-lambda`,${LAMBDA_ARN});
importedLambda.addPermission('allowInvocation',{
principal: new ServicePrincipal('events.amazonaws.com'), // ... and so on defining the permission
sourceArn: ...
});
答案 1 :(得分:1)
您不必修改服务X Stack。
以下示例假定您正在使用打字稿。
如果要允许整个服务(不建议使用)对lambda调用权限,则可以使用以下命令:
对于S3
yourfunction.grantInvoke(new ServicePrincipal('s3.amazonaws.com'));
对于SNS
yourfunction.grantInvoke(new ServicePrincipal('sns.amazonaws.com'));
但是我建议您指定要允许其调用lambda的特定资源ARN。例如,如果它是另一个lambda函数,则可以如下指定其Role ARN:
yourfunction.grantInvoke(new ArnPrincipal('arn:aws:iam:region:account-id:role/role-name'));
正如阿米特(Amit)在他的答案中提到的那样,如果要指定更细化的权限,也可以使用addPermission。您可以使用addPermission甚至允许其他AWS账户中的资源调用您的lambda。
答案 2 :(得分:0)
您可以使用“ cdk引导程序”来跟踪可满足cdk要求的aws密钥权限。
cdk bootstrap
⏳ Bootstrapping environment aws://999999999999/us-west-2...
✅ Environment aws://999999999999/us-west-2 bootstrapped (no changes).
以上是很好的打印方法。
我从https://cdkworkshop.com/20-typescript/20-create-project/500-deploy.html阅读了该指南