首页 > 解决方案 > 在对项目进行迭代时,如何维护 CloudFormation 堆栈和本地 CDK 开发之间的状态?

问题描述

我正在使用 AWS CDK 开始一个小项目。我用 CDK 创建了一个存储桶。

this.myBucket = new s3.Bucket(this,'my-first-bucket',{
  removalPolicy: cdk.RemovalPolicy.DESTROY
});

当我使用 部署它时cdk deploy,CloudFormation 使用生成的存储桶名称创建一个存储桶,例如mystack-myfirstbucket786ee605-1q912cjgtpj27.

现在,我开始编写一个 lambda 函数,它的工作将需要写入这个存储桶。我通过将 bucketName 添加到 lambda 的环境变量中来将它传递给 lambda。

this.myLambdaFunction = new lambda.Function(this, "my-function",{
  code: lambda.Code.fromAsset('lambda'),
  handler: 'myFunction.handler',
  runtime:  lambda.Runtime.NODEJS_14_X,
  memorySize: 256,
  timeout: cdk.Duration.seconds(60)
});

this.myLambdaFunction.addEnvironment('bucket', this.myBucket.bucketName );

当我在本地运行 lambda 时,当我迭代开发它时,如果我process.env.bucket在我的 lambda 中检查它,我会发现它具有不同的生成存储桶名称,即myfirstbucket786ee605与 CloudFormation 创建的存储桶不同。这可以防止我的 lambda 在我本地开发时写入该存储桶。

在开发过程中,我应该如何在本地环境和 AWS 环境之间维护 CloudFormation 状态?

标签: amazon-web-servicesamazon-cloudformationaws-cdk

解决方案


在您的 lambda 中,您可以执行此操作

this.myLambdaFunction = new lambda.Function(this, "my-function",{
  code: lambda.Code.fromAsset('lambda'),
  handler: 'myFunction.handler',
  runtime:  lambda.Runtime.NODEJS_14_X,
  memorySize: 256,
  environment: {
    s3BucketName: this.myBucket.bucketName
  }
  timeout: cdk.Duration.seconds(60)
});

然后在您在 lambda 中运行的代码中,您可以获得存储桶名称:

export const handler = async (event) => {
   let s3BucketName = process.env.s3BucketName;
}

这应该为您提供所需的环境名称。

旁注:如果您转到 AWS lambda 页面并导航到您的 lambda,您可以转到配置并查看保存了哪些环境变量。

更新 2 另一种方法是修改创建存储桶的堆栈,将存储桶名称存储在 SSM 字符串参数中,例如:

new ssm.StringParameter(this, 'My Bucket Name', {
  parameterName: 'My Bucket Name',
  stringValue:  this.myBucket.bucketName
});

然后在您创建 lambda 的堆栈中,您可以获取您的存储桶名称并以这种方式设置变量

let s3BucketName = ssm.StringParameter.valueForStringParameter(this, 'My Bucket Name');

this.myLambdaFunction = new lambda.Function(this, "my-function",{
  code: lambda.Code.fromAsset('lambda'),
  handler: 'myFunction.handler',
  runtime:  lambda.Runtime.NODEJS_14_X,
  memorySize: 256,
  environment: {
    s3BucketName: s3BucketName
  }
  timeout: cdk.Duration.seconds(60)
});

您可以尝试的另一件事是使用以下方法获取 lambda 中的 ssm 值aws-sdk: import * as AWS from 'aws-sdk'; export const handler = async (event) => {

 let ssm = new AWS.SSM({
   region: <region>,
   accessKeyId: '',
   secretAccessKey: ''
 });

  var params = {
    Name: 'My Bucket Name',
    WithDecryption: true || false
  }
    
  let s3Bucket = '';
  await ssm.getParameter(params).promise().then((data) => {
    s3Bucket = data.Parameter.Value
  });
}

推荐阅读