

# AWS CLI を使用してローカルアーティファクトを S3 バケットにアップロードする
<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)」を参照してください。