我的团队希望在cloudformation模板中创建一个S3存储桶,而不为其分配存储桶名称(让cloudformation为其自身命名)。
当我从lambda函数将文件放入S3存储桶时,有没有办法让我获得S3存储桶的名称而无需手动查看AWS控制台并检查创建了什么名称?
答案 0 :(得分:1)
您可以使用Fn::GetAtt
从新创建的S3存储桶中获取值。
你可以在这里查看。
S3 Ref & Get Attribute Documentation
问题是如何将值传递给lambda函数。 这是可能有效的步骤。
UserData
,或者如果您已使用cloud-init,则使用Metadata
。希望得到这个帮助。
答案 1 :(得分:0)
使用无服务器应用程序模型(SAM),可以在environment variables中包含function properties
AWSTemplateFormatVersion: '2010-09-09'
Description: "Demo"
Transform: 'AWS::Serverless-2016-10-31'
Resources:
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Runtime: nodejs10.x
Handler: index.handler
CodeUri: ./src
Policies:
- Version: '2012-10-17'
Statement:
- Action:
- s3:PutObject
Effect: 'Allow'
Resource: !Sub ${MyS3Bucket.Arn}/*
Environment:
Variables:
BUCKET_NAME: !Ref MyS3Bucket
MyS3Bucket:
Type: 'AWS::S3::Bucket'
然后,您的函数可以使用node.js中的process.env.BUCKET_NAME
访问环境变量。我认为您会在python中使用os.environ['BUCKET_NAME']
const aws = require('aws-sdk');
const s3 = new aws.S3();
exports.handler = async (event) => {
const params = {
Body: 'The Body',
Bucket: process.env.BUCKET_NAME,
Key: 'abc123',
}
return s3.putObject(params).promise();
}
我认为这适用于所有未使用SAM转换的CloudFormation模板。