问题描述
我正在使用 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
});
}