【问题标题】:Way to access S3 Bucket's name from cloudformation/boto3?从 cloudformation/boto3 访问 S3 Bucket 名称的方法?
【发布时间】:2018-04-04 15:57:33
【问题描述】:

我的团队想要在 cloudformation 模板中创建一个 S3 存储桶,但不为其分配存储桶名称(让 cloudformation 自己命名)。

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

【问题讨论】:

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


    【解决方案1】:

    使用无服务器应用程序模型 (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 模板。

    【讨论】:

      【解决方案2】:

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

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

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

      希望对您有所帮助。

      【讨论】:

      • 我看过了,但不太明白如何从我的 lambda 函数(而不仅仅是 CloudFormation 中的 lambda 模板)访问它。对此有何见解?
      • 我确实更改了上面的答案,请检查。
      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2019-12-22
      • 2022-06-21
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多