AWS CDK跨账户访问KMS加密Secrets Manager密钥的实现咨询
问题1:跨账户访问方案可行性
该跨账户访问方案完全可行,属于AWS官方推荐的跨账户共享敏感数据的标准实现方式。你提供的Python运行时代码无需修改即可使用:代码中已经指定了Secret的完整ARN以及密钥所在的us-east-1区域,无论Lambda部署在哪个账户、哪个区域,只要权限配置正确就能正常拉取密钥。
问题2:CDK配置及权限配置指引
注意:你的CodePipeline流水线不需要获取KMS或Secrets Manager的访问权限,因为密钥是Lambda运行时主动拉取的,部署阶段流水线仅负责下发代码,不会接触该密钥,仅需要完成以下两处配置即可。
第一步:Account-1侧资源权限配置(控制台/CDK均可操作)
你需要修改Account-1中已有KMS密钥和Secret的资源策略,开放权限给其他部署Lambda的账户:
- 修改客户托管KMS密钥
KMS-Account-1的资源策略,添加以下语句,允许其他Lambda所属账户的IAM实体继承解密权限:{ "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<Account-2的ID>:root", "arn:aws:iam::<Account-3的ID>:root" ] }, "Action": "kms:Decrypt", "Resource": "*" } - 修改目标Secret的资源策略,添加以下语句,允许其他Lambda所属账户的IAM实体拉取密钥值:
{ "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<Account-2的ID>:root", "arn:aws:iam::<Account-3的ID>:root" ] }, "Action": "secretsmanager:GetSecretValue", "Resource": "<该Secret的完整ARN>" }
第二步:CDK多环境部署逻辑修改
你只需要在定义Lambda的公共构造/Stack中,统一给Lambda执行角色添加访问权限即可,无需修改流水线逻辑,所有环境部署时会自动同步权限配置,Python CDK示例代码如下:
from aws_cdk import aws_lambda as _lambda from aws_cdk import aws_iam as iam # 替换为你实际的资源参数 ACCOUNT_1_ID = "你的Account-1的12位账户ID" KMS_ACCOUNT1_ARN = f"arn:aws:kms:us-east-1:{ACCOUNT_1_ID}:key/<KMS-Account-1的密钥ID>" TARGET_SECRET_ARN = f"arn:aws:secretsmanager:us-east-1:{ACCOUNT_1_ID}:secret:name/of/the/secret" # 你的Lambda定义逻辑 lambda_func = _lambda.Function( self, "YourLambda", runtime=_lambda.Runtime.PYTHON_3_10, handler="index.handler", code=_lambda.Code.from_asset("lambda_code") ) # 给Lambda执行角色添加跨账户访问权限 lambda_func.add_to_role_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=["secretsmanager:GetSecretValue"], resources=[TARGET_SECRET_ARN] )) lambda_func.add_to_role_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=["kms:Decrypt"], resources=[KMS_ACCOUNT1_ARN] ))
额外注意点
- 如果Lambda部署在VPC内且没有公网出口,需要在Lambda所在VPC中为
us-east-1区域的Secrets Manager和KMS配置Interface VPC Endpoint,否则会出现访问超时问题。 - 跨区域调用会产生少量跨区域数据传输费用,访问量级不大的情况下成本可忽略。
内容的提问来源于stack exchange,提问作者KnowSQL
相关产品推荐
相关产品推荐

