从cloudformation / boto3访问S3 Bucket的名称的方法?

时间:2017-10-24 00:55:37

标签: amazon-s3 aws-lambda amazon-cloudformation boto3

我的团队希望在cloudformation模板中创建一个S3存储桶,而不为其分配存储桶名称(让cloudformation为其自身命名)。

当我从lambda函数将文件放入S3存储桶时,有没有办法让我获得S3存储桶的名称而无需手动查看AWS控制台并检查创建了什么名称?

2 个答案:

答案 0 :(得分:1)

您可以使用Fn::GetAtt从新创建的S3存储桶中获取值。 你可以在这里查看。 S3 Ref & Get Attribute Documentation

问题是如何将值传递给lambda函数。 这是可能有效的步骤。

  • 使用上面的Get Attribute功能获取格式化创建的s3存储桶名称。
  • 将值插入文件,您可以使用UserData,或者如果您已使用cloud-init,则使用Metadata
  • 将文件存储到现有的s3存储桶(或lambda可以访问的任何其他存储)中,您可以使用云形成模板存储桶,它始终在启动云形态模板时创建(通常命名为cf-template ...)
  • 向lambda添加代码以访问s3并获取文件。现在,您可以获得已创建了cloudformation的s3存储桶的数据,并可以在lambda上使用它。

希望得到这个帮助。

答案 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模板。