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
的指南
我是 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
的指南