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

Lou*_*han 4 amazon-s3 aws-cloudformation boto3 aws-lambda

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

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

And*_*K11 9

使用无服务器应用程序模型 (SAM),您可以在函数属性中包含环境变量

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'
Run Code Online (Sandbox Code Playgroud)

然后您的函数可以使用process.env.BUCKET_NAMEnode.js访问环境变量。在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();
}
Run Code Online (Sandbox Code Playgroud)

我认为这适用于任何不使用 SAM 转换的 CloudFormation 模板。


sin*_*sin 1

您可以用来Fn::GetAtt从新创建的 S3 存储桶中获取值。您可以在这里查看。 S3 引用和获取属性文档

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

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

希望这有帮助。