AWS CDK v2能否获取执行cdk deploy的部署者身份变量?
问题结论
不存在可直接通过CloudFormation固有函数获取cdk deploy执行人员身份的内置变量,无法仅靠intrinsic functions实现这个需求。
原因说明
CloudFormation的固有函数、伪参数全部在CloudFormation服务端解析执行,服务端不会自动记录、暴露触发本次栈部署的调用方身份(不管是本地执行部署的个人用户,还是CI/CD流水线的执行角色),没有类似AWS::Deployer这类开箱即用的伪参数可供调用。
不过这个需求完全可以在CDK的synth阶段实现:CDK的TypeScript代码本身是在本地/CI运行环境执行的Node.js脚本,生成CloudFormation模板的阶段就可以拿到部署人身份,直接注入标签即可,不需要依赖CloudFormation端的能力。
实现方案(TypeScript + AWS CDK v2)
最简同步实现(覆盖90%场景)
直接在CDK代码里读取上下文参数、CI环境变量、本地系统用户名即可,不需要异步调用接口,示例:
import { App, Stack, Tags } from 'aws-cdk-lib'; const app = new App(); const stack = new Stack(app, 'YourServiceStack'); // 按优先级获取部署人标识 const deployer = app.node.tryGetContext('deployer') // 优先读命令行传入的上下文参数 || process.env.GITHUB_ACTOR // Github Actions 触发人 || process.env.GITLAB_USER_LOGIN // Gitlab CI 触发人 || process.env.USER // Linux/macOS 本地用户名 || process.env.USERNAME // Windows 本地用户名 || 'unknown-deployer'; // 兜底值 // 给栈下所有资源统一添加owner标签 Tags.of(stack).add('owner', deployer); // 其他栈资源逻辑写在这里 app.synth();
如果是在CI/CD流水线中执行部署,只需要在执行cdk deploy时把流水线内置的触发人变量通过上下文传入即可,例如Github Actions中:
cdk deploy -c deployer=${{ github.actor }}
Gitlab CI中:
cdk deploy -c deployer=$GITLAB_USER_LOGIN
传入的上下文值会被最高优先级读取,不需要修改其他代码逻辑。
更精准的身份获取(可选)
如果需要拿到当前执行部署的AWS身份ARN(而不是本地用户名),可以调用AWS STS的GetCallerIdentity接口获取,注意这部分是异步逻辑,需要等返回结果后再执行synth:
import { STSClient, GetCallerIdentityCommand } from "@aws-sdk/client-sts"; async function main() { const app = new App(); const stack = new Stack(app, 'YourServiceStack'); let deployer = app.node.tryGetContext('deployer') || process.env.GITHUB_ACTOR || process.env.GITLAB_USER_LOGIN; if (!deployer) { const sts = new STSClient({}); const identity = await sts.send(new GetCallerIdentityCommand({})); deployer = identity.Arn || 'unknown-deployer'; } Tags.of(stack).add('owner', deployer); // 其他栈资源逻辑 app.synth(); } main();
注意事项
- 不要尝试在标签值中编写CloudFormation固有函数来获取部署人,目前CloudFormation没有提供对应能力,这类写法只会返回空值或者部署报错。
- 如果有严格的审计要求,建议统一通过
-c deployer=xxx的上下文参数传入部署人标识,避免不同环境下环境变量、本地用户名不一致导致标签值不规范。
内容的提问来源于stack exchange,提问作者Shepy
相关产品推荐
相关产品推荐

