typescript 如何在其他CDK资源中使用CDK资源的ARN

k5ifujac  于 2023-08-08  发布在  TypeScript
关注(0)|答案(2)|浏览(146)

我有一个AWS CDK堆栈,其中包含一个Step Functions状态机和一个lambda函数。这个lambda函数使用StartExecution API,它需要状态机的ARN。我不知道如何获取状态机的ARN,因为它是不稳定的,不断变化。
我尝试在lambda函数的index.ts旁边创建一个.env文件。

const stateMachine = new stepfunctions.StateMachine(this, 'my-state-machine', {
     definition: waitState,
});

字符串
然后使用CDK堆栈中的fsstateMachine.stateMachineArn写入该.env文件。写入.env文件的结果是${Token[TOKEN.1056]}。这与登录到控制台时的结果相同。据我所知,ARN在CDK堆栈的当前“阶段”不可用,但我不知道如何在lambda函数部署之前将ARN获取到lambda函数。

t0ybt7op

t0ybt7op1#

为什么不直接将stateMachine.stateMachineArn传递给lambda函数呢?如果它是同一个堆栈的一部分,您应该可以通过从其中一个Construct公开ARN属性并从lambda引用它来实现。
如果它位于不同的堆栈中,则可能必须使用new CfnOutput导出它,并使用cdk.Fn.importValue将其导入到堆栈中
如果要在lambda代码中使用它,则必须将其作为环境变量传递给lambda函数。

gblwokeq

gblwokeq2#

我相信您使用环境变量的方法是正确的。在部署过程中,我不会动态创建一个.env文件作为将状态机ARN传递给lambda函数的方法,而是使用secrets managersystems manager parameter store,使其成为依赖项,并将其注入到函数environment变量中。
如果不运行代码,我不确定是否需要<resource>.addDependency(<other resource>),但如果您遇到任何部署操作顺序问题,请注意这一点。

import * as cdk from 'aws-cdk-lib'
import * as lambda from 'aws-cdk-lib/aws-lambda'
import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions'

export class Stack extends cdk.Stack implements cdk.Stack {
  constructor(scope, id, props?: cdk.StackProps) {
    super(scope, id, props)

    const stateMachine = new stepfunctions.StateMachine(this, 'state-machine', {
      definition: waitState,
    })

    const lambda = new lambda.Function(this, 'lambda', {
      environment: {
        STATE_MACHINE_ARN: stateMachine.stateMachineArn,
      },
    })

    lambda.node.addDependency(stateMachine)
  }
}

字符串

相关问题