AWS CDK - 更新现有的 lambda 环境变量

AWS CDK - update existing lambda environment variables

我希望能够通过 AWS CDK 更新现有的 lambda 函数。我需要更新环境变量配置。据我所知,这是不可能的,有什么可行的方法可以实现吗?

我正在使用这样的代码导入 lambda:

    const importedLambdaFromArn = lambda.Function.fromFunctionAttributes(
      this,
      'external-lambda-from-arn',
      {
        functionArn: 'my-arn',
        role: importedRole,
      }
    );

目前,我必须手动更改 cloudformation 模板。直接在cdk更新会好很多

CDK 的主要目的是使 AWS 客户能够自动 provision 资源。如果我们尝试更新由其他 CloudFormation 堆栈管理的 pre-existing 资源的设置,最好更新其父 CloudFormation 模板上的变量而不是 CDK。这为您提供了以下优势:

  • 变量应该是什么样子的只有一个真实来源
  • 每当从这些来源推送更新时,CDK 和 CloudFormation 模板之间没有拖拉 war。
  • 否则,因为这是一个计算层,所以只需从 CloudFormation 中删除 lambda 函数并开始完全使用 CDK 兄弟!

希望这条建议对您有所帮助

是的,这是可能的,尽管您应该在实际操作之前阅读@Allan_Chua 的回答。 Lambda 的 UpdateFunctionConfiguration API can modify a deployed function's environment variables. The CDK's AwsCustomResource 构造让我们在堆栈部署期间调用 API。*

假设您要将先前部署的 lambda 上的 TABLE_NAME 设置为 DynamoDB table 名称的值:

// MyStack.ts

const existingFunc = lambda.Function.fromFunctionArn(this, 'ImportedFunction', arn);

const table = new dynamo.Table(this, 'DemoTable', {
  partitionKey: { name: 'id', type: dynamo.AttributeType.STRING },
});

new cr.AwsCustomResource(this, 'UpdateEnvVar', {
  onCreate: {
    service: 'Lambda',
    action: 'updateFunctionConfiguration',
    parameters: {
      FunctionName: existingFunc.functionArn,
      Environment: {
        Variables: {
          TABLE_NAME: table.tableName,
        },
      },
    },
    physicalResourceId: cr.PhysicalResourceId.of('DemoTable'),
  },
  policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
    resources: [existingFunc.functionArn],
  }),
});

在幕后,custom resource 创建了一个 lambda,它在创建堆栈时使用 JS SDK 进行 UpdateFunctionConfiguration 调用。还有 onUpdateonDelete 个案例需要处理。


* 同样,这是否是 good idea or not 取决于用例。你总是可以在没有 CDK 的情况下调用 UpdateFunctionConfiguration