将本地构件上传到 S3 存储桶 - AWS CloudFormation

将本地构件上传到 S3 存储桶

对于需要 Amazon S3 位置(桶名称和文件名)的部分资源属性,您可改为指定本地引用。例如,您可指定 AWS Lambda 函数的源代码或 Amazon API Gateway REST API 的 OpenAPI(之前称为 Swagger)文件的 S3 位置。您可以在模板中指定名为“本地项目”的本地引用,然后使用 package 命令快速上传它们,而不是将文件手动上传到 S3 存储桶,然后向模板添加位置。本地项目是 package 命令将向 Amazon S3 上传的文件或文件夹的路径。例如,构件可以是 AWS Lambda 函数的源代码或 Amazon API Gateway REST API 的 OpenAPI 文件的本地路径。

如果您指定一个文件,此命令会将该文件直接上传到 S3 存储桶。在上传项目之后,此命令将返回模板的副本,并将对本地项目的引用替换为命令已将项目上传到的 S3 位置。然后,您可使用返回的模板创建或更新堆栈。

如果您指定一个文件夹,此命令将为该文件夹创建一个 .zip 文件,然后上传该 .zip 文件。如果您未指定路径,此命令将为工作目录创建一个 .zip 文件,然后上传该 .zip 文件。您可指定绝对路径或相对路径,其中相对路径相对于模板的位置。

您只能对 package 命令支持的资源属性使用本地项目。有关此命令的更多信息和支持的资源属性的列表,请参阅《AWS CLI 命令参考》中的 aws cloudformation package 命令。

以下模板指定 Lambda 函数的源代码的本地项目。此源代码存储在用户的 /home/user/code/lambdafunction 文件夹中。

原始模板

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Resources": {
    "MyFunction": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "nodejs18.x",
        "CodeUri": "/home/user/code/lambdafunction"
      }
    }
  }
}

以下命令创建包含函数的源代码文件夹的 .zip 文件,然后将 .zip 文件上传到 my-bucket 存储桶的根文件夹。

包命令

aws cloudformation package \ --template /path_to_template/template.json \ --s3-bucket mybucket \ --output-template-file packaged-template.json \ --use-json

此命令将它生成的模板保存到由 --output 选项指定的路径。此命令将构件替换为 Amazon S3 位置,如以下示例中所示:

结果模板

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Resources": {
    "MyFunction": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "nodejs18.x",
        "CodeUri": "s3://mybucket/<md5 checksum>"
      }
    }
  }
}