迭代项目时如何维护 CloudFormation 堆栈和本地 CDK 开发之间的状态?
How do I maintain state between CloudFormation stacks and local CDK development when iterating on a project?
我正在使用 AWS CDK 开始一个小项目。我用 CDK 创建了一个 bucket。
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, "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)
});
您可以尝试的另一件事是使用 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
});
}
我正在使用 AWS CDK 开始一个小项目。我用 CDK 创建了一个 bucket。
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, "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)
});
您可以尝试的另一件事是使用 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
});
}