【发布时间】:2018-04-04 15:57:33
【问题描述】:
我的团队想要在 cloudformation 模板中创建一个 S3 存储桶,但不为其分配存储桶名称(让 cloudformation 自己命名)。
从我的 lambda 函数将文件放入 S3 存储桶时,有没有办法让我获得 S3 存储桶的名称,而无需手动查看 AWS 控制台并检查创建的名称?
【问题讨论】:
标签: amazon-s3 aws-lambda amazon-cloudformation boto3
我的团队想要在 cloudformation 模板中创建一个 S3 存储桶,但不为其分配存储桶名称(让 cloudformation 自己命名)。
从我的 lambda 函数将文件放入 S3 存储桶时,有没有办法让我获得 S3 存储桶的名称,而无需手动查看 AWS 控制台并检查创建的名称?
【问题讨论】:
标签: amazon-s3 aws-lambda amazon-cloudformation boto3
使用无服务器应用程序模型 (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 模板。
【讨论】:
您可以使用Fn::GetAtt 从新创建的 S3 存储桶中获取值。
你可以在这里查看。
S3 Ref & Get Attribute Documentation
问题是如何将值传递给 lambda 函数。 这是可能可行的步骤。
UserData,如果您已经在使用cloud-init,则使用Metadata。希望对您有所帮助。
【讨论】: