使用CDK(TypeScript)获取新建Lambda的ARN并设为自身环境变量问题
解决方案
要将Lambda自身的ARN作为环境变量传入,避免循环依赖和语法错误,可以通过ARN格式拼接的方式实现,无需依赖参数存储。以下是两种可行的TypeScript CDK实现方式:
方法1:使用cdk.Arn.format
import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as iam from 'aws-cdk-lib/aws-iam'; export class YourStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); const lambdaRole = new iam.Role(this, 'LambdaExecutionRole', { assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), // 按需添加权限配置 }); const stsLambda = new lambda.DockerImageFunction(this, 'StsLambda', { role: lambdaRole, code: lambda.DockerImageCode.fromImageAsset('./path-to-docker-dir'), // 其他Lambda配置项 }); // 构造并添加ARN环境变量 stsLambda.addEnvironment('TARGET_ARN', cdk.Arn.format({ service: 'lambda', resource: 'function', resourceName: stsLambda.functionName, }, this)); } }
方法2:使用cdk.Fn.sub
// 承接上面的Lambda定义 stsLambda.addEnvironment('TARGET_ARN', cdk.Fn.sub( 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${functionName}', { functionName: stsLambda.functionName } ));
为什么之前的尝试失败?
- 构造函数内直接引用
sts.functionArn:此时sts对象尚未完成初始化,无法访问其属性。 sts.addEnvironment('TARGET_ARN', sts.functionArn):CDK会检测到循环依赖(Lambda环境变量依赖自身ARN,而ARN又依赖Lambda资源),因此抛出错误。cdk.Fn.getAtt(sts.functionName, "Arn"):Fn.getAtt的第一个参数需要是资源的逻辑ID字符串,而非sts.functionName返回的Token,导致模板验证错误。
内容的提问来源于stack exchange,提问作者Michael D Johnson
相关产品推荐
相关产品推荐

