

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# を使用したデフォルトのビルド AWS SAM
<a name="serverless-sam-cli-using-build"></a>

サーバーレスアプリケーションを構築するには、`sam build` コマンドを使用します。このコマンドは、アプリケーションの依存関係のビルドアーティファクトも収集して、ローカルでのテスト、パッケージ化、およびデプロイなどの次のステップのために、それらを適切な形式と場所に設定します。

アプリケーションの依存関係は、マニフェストファイル (`requirements.txt` (Python) または `package.json` (Node.js) など) で指定するか、関数リソースの `Layers` プロパティを使用して指定します。`Layers` プロパティには、Lambda 関数が依存する [AWS Lambda レイヤー](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)リソースのリストが含まれています。

アプリケーションのビルドアーティファクトの形式は、各関数の `PackageType` プロパティに応じて異なります。このプロパティのオプションには次のものがあります。
+ **`Zip`** - アプリケーションコードとその依存関係が含まれる .zip ファイルアーカイブ。コードを .zip ファイルアーカイブとしてパッケージ化する場合は、関数の Lambda ランタイムを指定する必要があります。
+ **`Image`** - アプリケーションコードとその依存関係に加えて、ベースオペレーティングシステム、ランタイム、および拡張機能が含まれているコンテナイメージ。

Lambda パッケージタイプに関する詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda デプロイパッケージ](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html)」を参照してください。

**Topics**
+ [.zip ファイルアーカイブの構築](#build-zip-archive)
+ [コンテナイメージの構築](#build-container-image)
+ [コンテナ環境変数ファイル](#serverless-sam-cli-using-container-environment-file)
+ [ソースフォルダにプロジェクトを構築することでビルド時間を短縮する](#serverless-sam-cli-using-build-in-source)
+ [例](#building-applications-examples)
+ [の外部で関数を構築する AWS SAM](#building-applications-skip)

## .zip ファイルアーカイブの構築
<a name="build-zip-archive"></a>

サーバーレスアプリケーションを.zip ファイルアーカイブとして構築するには、サーバーレス関数に `PackageType: Zip` を宣言します。

AWS SAM は、指定した[アーキテクチャ](sam-resource-function.md#sam-function-architectures)用にアプリケーションを構築します。アーキテクチャを指定しない場合、 `x86_64` はデフォルトで AWS SAM を使用します。

ネイティブにコンパイルされたプログラムが含まれるパッケージに Lambda 関数が依存する場合は、`--use-container` フラグを使用します。このフラグは、Lambda 環境のように動作するコンテナで関数をローカルにコンパイルするため、 AWS クラウドにデプロイするときに適切な形式になります。

`--use-container` オプションを使用すると、 はデフォルトで [Amazon ECR Public](https://docs.aws.amazon.com/AmazonECR/latest/public/what-is-ecr.html) からコンテナイメージを AWS SAM プルします。別のリポジトリまたは特定のバージョンの CLI AWS SAM からコンテナイメージをプルする場合は、 `--build-image`オプションを使用して代替コンテナイメージの URI を指定できます。以下は、特定のバージョンの CLI のコンテナイメージを使用してアプリケーションを構築するための 2 AWS SAM つのコマンドの例です。

```
# Build a Node.js 20 application using a container image for a specific version of AWS SAM CLI (1.136.0)
sam build --use-container --build-image public.ecr.aws/sam/build-nodejs22.x:1.136.0

# Build a function resource using the Python 3.13 container image from a specific version of AWS SAM CLI (1.136.0)(
sam build --use-container --build-image Function1=public.ecr.aws/sam/build-python3.13:1.136.0
```

.zip ファイルアーカイブアプリケーションのその他の構築例については、このトピックの後半にある「例」セクションを参照してください。

## コンテナイメージの構築
<a name="build-container-image"></a>

サーバーレスアプリケーションをコンテナイメージとして構築するには、サーバーレス関数に `PackageType: Image` を宣言します。また、以下のエントリを使って `Metadata` リソース属性を宣言する必要もあります。

`Dockerfile`  
Lambda 関数に関連付けられた Dockerfile の名前。

`DockerContext`  
Dockerfile の場所。

`DockerTag`  
(オプション) 構築されたイメージに適用するタグ。

`DockerBuildArgs`  
ビルド用のビルド引数。  
 AWS SAM CLI では、`DockerBuildArgs` 引数に含める情報の編集または難読化は行われません。このセクションを使用してパスワードやシークレットなどの機密情報を保存しないことを強くお勧めします。

以下は、`Metadata` リソース属性セクションの例です。

```
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: v1
```

`Image` パッケージタイプで設定されたサンプルアプリケーションをダウンロードするには、「[チュートリアル: を使用して Hello World アプリケーションをデプロイする AWS SAM](serverless-getting-started-hello-world.md)」を参照してください。インストールしたいパッケージタイプをたずねるプロンプトで、[`Image`] を選択します。

**注記**  
Dockerfile でマルチアーキテクチャベースイメージを指定すると、 はホストマシンのアーキテクチャ用のコンテナイメージ AWS SAM を構築します。別のアーキテクチャ用に構築するには、特定のターゲットアーキテクチャを使用するベースイメージを指定します。

## コンテナ環境変数ファイル
<a name="serverless-sam-cli-using-container-environment-file"></a>

ビルドコンテナの環境変数が含まれた JSON ファイルを提供するには、`sam build` コマンドで `--container-env-var-file` 引数を使用します。すべてのサーバーレスリソースに適用される単一の環境変数を提供する、または各リソースに異なる環境変数を提供することができます。

### 形式
<a name="serverless-sam-cli-using-container-environment-file-format"></a>

環境変数をビルドコンテナに渡す形式は、リソースに提供する環境変数の数に応じて異なります。

すべてのリソースに対して単一の環境変数を提供するには、以下のように `Parameters` オブジェクトを指定します。

```
{
  "Parameters": {
    "GITHUB_TOKEN": "TOKEN_GLOBAL"
  }
}
```

各リソースに異なる環境変数を提供するには、以下のようにリソースごとにオブジェクトを指定します。

```
{
  "MyFunction1": {
    "GITHUB_TOKEN": "TOKEN1"
  },
  "MyFunction2": {
    "GITHUB_TOKEN": "TOKEN2"
  }
}
```

環境変数をファイル (`env.json` と命名されたファイルなど) として保存します。以下のコマンドは、このファイルを使用して環境変数をビルドコンテナに渡します。

```
sam build --use-container --container-env-var-file env.json
```

### 優先順位
<a name="serverless-sam-cli-using-container-environment-file-precedence"></a>
+ すべてのリソースに対する単一の環境変数よりも、特定のリソースに提供する環境変数が優先されます。
+ ファイル内の環境変数よりも、コマンドラインで提供する環境変数が優先されます。

## ソースフォルダにプロジェクトを構築することでビルド時間を短縮する
<a name="serverless-sam-cli-using-build-in-source"></a>

サポートされているランタイムとビルドメソッドについては、`--build-in-source` オプションを使用してプロジェクトをソースフォルダに直接構築できます。デフォルトでは、 は一時ディレクトリに AWS SAM CLIビルドされます。これには、ソースコードとプロジェクトファイルのコピーが含まれます。を使用すると`--build-in-source` AWS SAM 、 はソースフォルダに直接CLIビルドされるため、一時ディレクトリにファイルをコピーする必要がなくなるため、ビルドプロセスが高速化されます。

サポートされているランタイムとビルドメソッドのリストについては、「`--build-in-source`」を参照してください。

## 例
<a name="building-applications-examples"></a>

### 例 1。 .zip ファイルアーカイブ
<a name="examples-zip-archives"></a>

以下の `sam build` コマンドは、.zip ファイルアーカイブを構築します。

```
# Build all functions and layers, and their dependencies
sam build

# Run the build process inside a Docker container that functions like a Lambda environment
sam build --use-container

# Build a Node.js 20 application using a container image for a specific version of AWS SAM CLI (1.136.0)
sam build --use-container --build-image public.ecr.aws/sam/build-nodejs22.x:1.136.0

# Build a function resource using the Python 3.13 container image from a specific version of AWS SAM CLI (1.136.0)(
sam build --use-container --build-image Function1=public.ecr.aws/sam/build-python3.13:1.136.0

# Build and run your functions locally
sam build && sam local invoke

# For more options
sam build --help
```

### 例 2: コンテナイメージ
<a name="examples-container-image-1"></a>

次の AWS SAM テンプレートはコンテナイメージとしてビルドされます。

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      ImageConfig:
        Command: ["app.lambda_handler"]
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: v1
```

以下は、Dockerfile 例です。

```
FROM public.ecr.aws/lambda/python:3.12

COPY app.py requirements.txt ./

RUN python3.12 -m pip install -r requirements.txt

# Overwrite the command by providing a different command directly in the template.
CMD ["app.lambda_handler"]
```

### 例 3: npm ci
<a name="examples-npm-ci"></a>

Node.js アプリケーションでは、`npm install`の代わりに、`npm ci`を使用して依存関係をインストールします。`npm ci` を使用するには、Lambda 関数の `Metadata` リソース属性の `BuildProperties` の下に `UseNpmCi: True` を指定します。`npm ci` を使用するには、アプリケーションは Lambda 関数の `CodeUri` に `package-lock.json` または `npm-shrinkwrap.json` ファイルが必要です。

次の例では、`sam build` を実行するときに、`npm ci` を使用して依存関係をインストールします。

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.handler
      Runtime: nodejs20.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      BuildProperties:
        UseNpmCi: True
```

### Python 親パッケージ
<a name="building-applications-python-parent-packages"></a>

Python アプリケーションでは、構築プロセス中にパッケージ構造を保持して絶対インポートを有効にすることができます。パッケージ構造を保持するには、Lambda 関数の `Metadata` リソース属性にある `BuildProperties` で `ParentPackageMode` を指定します。

次の例では、`sam build` を実行するときに `app` パッケージ構造が保持されます。

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.main.handler
      Runtime: python3.12
      Architectures:
        - x86_64
    Metadata:
      BuildProperties:
        ParentPackageMode: explicit
        ParentPackages: app
```

この設定では、コードが `from .utils import logger` のような相対インポートではなく、`from app.utils import logger` のような絶対インポートを使用できます。

## の外部で関数を構築する AWS SAM
<a name="building-applications-skip"></a>

デフォルトでは、 を実行すると**sam build**、 はすべての関数リソース AWS SAM を構築します。その他のオプションには以下が含まれます。
+ **の外部ですべての関数リソースを構築する AWS SAM** – すべての関数リソースを手動で構築する場合、または別のツールを使用して構築する場合、 **sam build**は必要ありません。**sam build** をスキップして、ローカルテストの実行やアプリケーションのデプロイなど、プロセスの次のステップに進むことができます。
+ **の外部で一部の関数リソースを構築する AWS SAM** – の外部で他の関数リソース AWS SAM を構築しながら、関数リソースの一部を構築する場合は AWS SAM、 AWS SAM テンプレートで指定できます。

### の外部で一部の関数リソースを構築する AWS SAM
<a name="building-applications-skip-some"></a>

の使用時に で関数を AWS SAM スキップするには**sam build**、 AWS SAM テンプレートで以下を設定します。

1. `SkipBuild: True` メタデータプロパティを関数に追加します。

1. 構築した関数リソースへのパスを指定します。

`TestFunction` がスキップされるように設定した例を次に示します。構築されたリソースは `built-resources/TestFunction.zip` にあります。

```
TestFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: built-resources/TestFunction.zip
    Handler: TimeHandler::handleRequest
    Runtime: java11
  Metadata:
    SkipBuild: True
```

これで、 を実行すると**sam build**、 AWS SAM は以下を実行します。

1. AWS SAM は、 で設定された関数をスキップします`SkipBuild: True`。

1. AWS SAM は、他のすべての関数リソースをビルドし、`.aws-sam`ビルドディレクトリにキャッシュします。

1. スキップされた関数の場合、`.aws-sam` ビルドディレクトリ内のテンプレートは、構築された関数リソースへの指定されたパスを参照するように自動的に更新されます。

   `.aws-sam` ビルドディレクトリの `TestFunction` についてキャッシュされたテンプレートの例を次に示します。

   ```
   TestFunction:
     Type: AWS::Serverless::Function
     Properties:
       CodeUri: ../../built-resources/TestFunction.zip
       Handler: TimeHandler::handleRequest
       Runtime: java11
     Metadata:
       SkipBuild: True
   ```