AWS CDK授予对堆栈外部资源的权限

时间:2020-02-21 11:28:36

标签: amazon-web-services aws-lambda aws-cdk

我对AWS CDK相当陌生,并且对AWS没有太多经验。在我正在编写的CDK堆栈中,我必须授予使用其他CDK模板构建且已经在aws中的资源的权限。

可以说,我的堆栈A包含一个lambda,该lambda将被另一个服务X调用。服务X需要具有lambda的调用权限。我可以从服务栈A代码中授予服务X许可,还是需要修改服务X堆栈?

3 个答案:

答案 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阅读了该指南