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

AWS CDK give permission to resources outside the stack

我是 AWS CDK 的新手,没有很多 AWS 经验。在我正在编写的 CDK 堆栈中,我必须授予使用其他 CDK 模板构建并且已经在 aws 中的资源的权限。

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

一般来说,答案是肯定的,您可以为在堆栈外创建的资源添加权限。但是,您需要确保资源是可导入的。

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: ...
});

您不必修改服务 X 堆栈。

以下示例假设您使用的是打字稿。

如果您想允许整个服务(不推荐)调用您的 lambda 的权限,您可以使用以下方法:

对于 S3

yourfunction.grantInvoke(new ServicePrincipal('s3.amazonaws.com'));

对于 SNS

yourfunction.grantInvoke(new ServicePrincipal('sns.amazonaws.com'));

但我建议指定您希望允许调用您的 lambda 的特定资源 ARN。例如,如果它是另一个 lambda 函数,您可以指定其角色 ARN,如下所示:

yourfunction.grantInvoke(new ArnPrincipal('arn:aws:iam:region:account-id:role/role-name'));

正如 Amit 在他的回答中提到的,如果您想指定更精细的权限,您也可以使用 addPermission。您甚至可以使用 addPermission 来允许其他 AWS 账户中的资源调用您的 lambda。

您可以使用“cdk bootstrap”来追踪aws key权限是否满足cdk要求

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

的指南