amazon-web-services - 在对项目进行迭代时,如何维护 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 状态?
解决方案
在您的 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
});
}
推荐阅读
- javascript - 如何通过脚本元素访问由 javascript 加载的外部脚本
- python - 在 Mac OSX 上安装 Pyinstaller
- c++ - 使用两个 uint_32 数字的倍数时,模幂运算溢出
- html - 在内联列表元素之间添加水平线
- python - 将多列转换为 MultiIndex
- java - Java - 旧数组总是等于新数组?
- javascript - 如何将 vue 与原始 tcp 节点服务器连接?
- branch - 如何在 GitKraken 中删除多个分支?
- c++ - 在 C++ 中获取数据库连接
- python-3.x - 使用 Folium 在地图上创建标记会导致空白 HTML 页面