微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迭代项目时,如何维护 CloudFormation 堆栈和本地 CDK 开发之间的状态?

如何解决迭代项目时,如何维护 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 时,当我迭代开发它时,如果我检查我的 lambda 中的 process.env.bucket,我会看到它具有不同的生成名称,即myfirstbucket786ee605,与CloudFormation 创建的存储桶。这可以防止我的 lambda 在我本地开发时写入该存储桶。

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

解决方法

在您的 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 StringParameter 中,例如:

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,environment: {
    s3BucketName: s3BucketName
  }
  timeout: cdk.Duration.seconds(60)
});

您可以尝试的另一件事是使用 aws-sdk 获取 lambda 中的 ssm 值: 从 'aws-sdk' 导入 * 作为 AWS; 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
  });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。