

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 將本機成品上傳至 S3 儲存貯體 AWS CLI
<a name="using-cfn-cli-package"></a>

您可以使用 AWS CLI 將 CloudFormation 範本參考的本機成品上傳至 Amazon S3 儲存貯體。本機成品指的是您在範本中參考的檔案。您不需要手動上傳檔案到 S3 儲存貯體，然後將其位置新增到您的範本，您可以在您的範本中指定本機成品，然後使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) 命令來快速上傳。

本機成品是 **package** 命令上傳至 Amazon S3 的檔案或資料夾的路徑。例如，成品可以是 AWS Lambda 函數原始碼的本機路徑或 Amazon API Gateway REST API OpenAPI 檔案。

使用 **package** 命令時：
+ 如果您指定檔案，命令會將它直接上傳至 S3 儲存貯體。
+ 如果您指定資料夾，命令將建立該資料夾的 `.zip` 檔案，然後上傳 `.zip` 檔案。
+ 如果您不指定路徑，命令將建立工作目錄的 `.zip` 檔案，然後上傳。

您可以指定絕對或相對路徑，相對路徑相對於範本的位置。

上傳成品之後，命令會傳回範本的副本，以命令上傳成品的 S3 位置取代本機成品的參考。然後，您可以使用傳回的範本來建立或更新堆疊。

**注意**  
您只能在 **package** 命令支援的資源屬性中使用本機成品。如需有關此命令和受支援資源屬性清單的詳細資訊，請參閱 [AWS CLI 命令參考](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html)中的 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) 文件。



## 先決條件
<a name="using-cfn-cli-package-prerequisites"></a>

開始之前，您必須具備現有的 Amazon S3 儲存貯體。

## 封裝並部署包含本機成品的範本
<a name="package-and-deploy-a-template-with-local-artifacts"></a>

以下範本指定用於 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"
      }
    }
  }
}
```

下列 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) 命令會建立函數原始碼資料夾的 `.zip` 檔案，並將其上傳至指定儲存貯體的根目錄。

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/template.json \
  --output-template-file packaged-template.json \
  --output json
```

命令會在 `--output-template-file` 指定的路徑上產生新的範本。如下所示，它會將成品參考取代為 Amazon S3 位置。`.zip` 檔案會使用資料夾內容的 MD5 檢查總和來命名，而非資料夾本身的名稱。

**產生範本**

```
{
  "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://amzn-s3-demo-bucket/md5 checksum"
      }
    }
  }
}
```

封裝範本的成品後，請使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/) 命令部署已處理的範本。

```
aws cloudformation deploy \
  --template-file packaged-template.json \
  --stack-name stack-name
```

部署超過 51,200 位元組的範本時，請搭配 `--s3-bucket` 選項使用 **deploy** 命令將範本上傳至 S3，如下列範例所示。

```
aws cloudformation deploy \
  --template-file packaged-template.json \
  --stack-name stack-name \
  --s3-bucket amzn-s3-demo-bucket
```

**注意**  
如需使用 **package** 命令上傳本機成品的另一個範例，請參閱 [運用巢狀堆疊，將範本分割成可重複使用的部分](using-cfn-nested-stacks.md)。