SAM 可以创建 s3 存储桶来存储 lambda 函数代码吗?

Can SAM create the s3 bucket to store the lambda function code?

也许这不止是一个问题。尝试注册 SAM Slack 频道,但没有成功。

我正在试用 SAM 来构建无服务器应用程序。我习惯于使用 Cloudformation 模板来描述所需的所有资源。现在我很困惑为什么 SAM 的 cli 要求我将 s3 存储桶传递到上传 lambda 函数代码的位置。我通常希望 s3 存储桶(具有随机名称)的创建成为 Cloudformation 模板执行的一部分。 SAM 是 Cloudformation 的扩展吗?

在我的 template.yaml 我有这样的东西:

Resources:

  SrcBucket:
    Type: AWS::S3::Bucket

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Timeout: 3
      Runtime: python3.7
      Handler: my.lambda_handler
      CodeUri: my/
      Events:
        ShopifyInstall:
          Type: Api
          Properties:
            Path: /
            Method: get

如何在 CodeUri 中引用 SrcBucket?

很遗憾没有。

SAM 模板的部署分为两部分,一部分是 package 命令,它主要构建 zip 文件并需要一个 s3 存储桶将其上传到。 部署命令可以像 cloudformation 一样简单地部署打包的应用程序。

我通常有一个带有多个 cloudformation 堆栈的小 bash 脚本,其中一个是创建此存储桶的帮助程序堆栈(并且还在输出中添加名称),然后获取名称并将其传递给所有其他堆栈

#Create the Helper stack
echo "---------Create Helper stack ---------"
aws cloudformation deploy  --profile ${profile} --stack-name $helperStack -- 
region ${region} --template-file deployment-helper.yaml

serverlessCodeBucketName="$(aws cloudformation --region ${region} --profile 
${profile} describe-stacks --stack-name $helperStack --query 
'Stacks[0].Outputs[?OutputKey==`CodeBucketName`].OutputValue' --output text)"

aws cloudformation package --profile ${profile}  --region ${region} -- 
template-file template.yaml  --output - 
template-file serverless-output.yaml --s3-bucket 
${serverlessCodeBucketName}

aws cloudformation deploy --profile ${profile}  --stack-name 
${applicationStack} --region ${region} --template-file 
serverless-output.yaml --capabilities 
CAPABILITY_IAM