

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

# パフォーマンスを向上させるためのキャッシュビルド
<a name="build-caching"></a>

キャッシュを使用すると、プロジェクトを構築する時間を短縮できます。キャッシュでは、ビルド環境の再利用可能な部分が保存され、複数のビルドでそれらを使用することができます。ビルドプロジェクトでは、Amazon S3 とローカルの 2 種類のキャッシュのうち、いずれかを使用できます。ローカルキャッシュを使用する場合は、3 つのキャッシュモード (ソースキャッシュ、Docker レイヤーキャッシュ、カスタムキャッシュ) のうち 1 つ以上を選択する必要があります。

**注記**  
Docker レイヤーキャッシュモードは Linux 環境でのみ利用可能です。このモードを選択する場合は、権限モードでビルドを実行する必要があります。CodeBuild のプロジェクトでは、権限モードは、ビルドプロジェクトの Docker コンテナにすべてのデバイスへのアクセスを許可します。詳細については、Docker Docs ウェブサイトの「[ランタイム特権と Linux 機能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)」を参照してください。

**Topics**
+ [Amazon S3 のキャッシュ](caching-s3.md)
+ [ローカルキャッシュ](caching-local.md)
+ [ローカルキャッシュを指定](specify-caching-local.md)

# Amazon S3 のキャッシュ
<a name="caching-s3"></a>

Amazon S3 キャッシュでは、複数のビルドホスト間で利用できるキャッシュを Amazon S3 バケットに保存します。これは、ダウンロードするよりも構築にコストがかかる小規模から中間ビルドアーティファクトに適したオプションです。

ビルドで Amazon S3 を使用するには、`buildspec.yml` にキャッシュするファイルのパスを指定できます。CodeBuild は、プロジェクトで設定された Amazon S3 の場所にキャッシュを自動的に保存し、更新します。ファイルパスを指定しない場合、CodeBuild はビルドの高速化に役立つ共通言語の依存関係をベストエフォートでキャッシュします。キャッシュの詳細は、ビルドログで表示できます。

さらに、複数のバージョンのキャッシュが必要な場合は、`buildspec.yml` でキャッシュキーを定義できます。CodeBuild はこのキャッシュキーのコンテキストにキャッシュを保存し、作成後に更新されない一意のキャッシュコピーを作成します。キャッシュキーはプロジェクト間で共有することもできます。動的キー、キャッシュバージョニング、ビルド間のキャッシュ共有などの機能は、キーが指定されている場合にのみ使用できます。

buildspec ファイルのキャッシュ構文の詳細については、buildspec リファレンスの「[キャッシュ](build-spec-ref.md#build-spec.cache)」を参照してください。

**Topics**
+ [動的キーを生成する](#caching-s3-dynamic)
+ [codebuild-hash-files](#caching-s3-dynamic.codebuild-hash-files)
+ [キャッシュバージョン](#caching-s3-version)
+ [プロジェクト間のキャッシュ共有](#caching-s3-sharing)
+ [buildspec の例](#caching-s3-examples)

## 動的キーを生成する
<a name="caching-s3-dynamic"></a>

キャッシュキーは、シェルコマンドと環境変数を含めて一意にし、キーが変更されたときの自動キャッシュ更新を有効にすることができます。たとえば、`package-lock.json` ファイルのハッシュを使用してキーを定義できます。そのファイルの依存関係が変更されると、ハッシュ、つまりキャッシュキーが変更され、新しいキャッシュの自動作成がトリガーされます。

```
cache:
    key: npm-key-$(codebuild-hash-files package-lock.json)
```

CodeBuild は式 `$(codebuild-hash-files package-lock.json)` を評価して最終的なキーを取得します。

```
npm-key-abc123
```

`CODEBUILD_RESOLVED_SOURCE_VERSION` などの環境変数を使用してキャッシュキーを定義することもできます。これにより、ソースが変更されるたびに新しいキーが生成され、新しいキャッシュが自動的に保存されます。

```
cache:
   key: npm-key-$CODEBUILD_RESOLVED_SOURCE_VERSION
```

CodeBuild は式を評価して最終的なキーを取得します。

```
npm-key-046e8b67481d53bdc86c3f6affdd5d1afae6d369
```

## codebuild-hash-files
<a name="caching-s3-dynamic.codebuild-hash-files"></a>

`codebuild-hash-files` は、glob パターンを使用して CodeBuild ソースディレクトリ内の一連のファイルの SHA-256 ハッシュを計算する CLI ツールです。

```
codebuild-hash-files <glob-pattern-1> <glob-pattern-2> ...
```

次に `codebuild-hash-files` の使用例を示します。

```
codebuild-hash-files package-lock.json
codebuild-hash-files '**/*.md'
```

## キャッシュバージョン
<a name="caching-s3-version"></a>

キャッシュバージョンは、キャッシュされるディレクトリのパスから生成されるハッシュです。2 つのキャッシュのバージョンが異なる場合、それらはマッチングプロセス中に個別のキャッシュとして扱われます。たとえば、次の 2 つのキャッシュは異なるパスを参照するため、異なると見なされます。

```
version: 0.2

phases:
  build:
    commands:
      - pip install pandas==2.2.3 --target pip-dependencies
cache:
  key: pip-dependencies 
  paths:
    - "pip-dependencies/**/*"
```

```
version: 0.2

phases:
  build:
    commands:
      - pip install pandas==2.2.3 --target tmp/pip-dependencies
cache:
  key: pip-dependencies 
  paths:
    - "tmp/pip-dependencies/**/*"
```

## プロジェクト間のキャッシュ共有
<a name="caching-s3-sharing"></a>

`cache` セクションにある `cacheNamespace` API フィールドを使用して、複数のプロジェクト間でキャッシュを共有できます。このフィールドでは、キャッシュの範囲が定義されます。キャッシュを共有するには、以下を行う必要があります。
+ 同じ `cacheNamespace` を使用する。
+ 同じキャッシュ `key` を指定する。
+ 同一のキャッシュパスを定義する。
+ 同じ Amazon S3 バケットを使用し、設定されている場合は `pathPrefix` を使用する。

これにより、一貫性が確保され、プロジェクト間でキャッシュ共有が可能になります。

### キャッシュ名前空間を指定する (コンソール)
<a name="caching-s3-sharing.console"></a>

1. [https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) で AWS CodeBuild コンソールを開きます。

1. **[プロジェクトを作成]** を選択します。詳細については、「[ビルドプロジェクトの作成 (コンソール)](create-project.md#create-project-console)」および「[ビルドの実行 (コンソール)](run-build-console.md)」を参照してください。

1. [**アーティファクト**] で、[**追加設定**] を選択します。

1. [**キャッシュタイプ**] で、[**Amazon S3**] を選択します。

1. [**キャッシュ名前空間 - オプション**] で、名前空間の値を入力します。  
![\[CodeBuild コンソールで名前空間パラメータをキャッシュします。\]](http://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/images/s3-cache-namespace.png)

1. デフォルト値のまま続行し、**[ビルドプロジェクトを作成する]** を選択します。

### キャッシュ名前空間を指定する (AWS CLI)
<a name="caching-s3-sharing.cli"></a>

で `--cache`パラメータを使用して AWS CLI 、キャッシュ名前空間を指定できます。

```
--cache '{"type": "S3", "location": "your-s3-bucket", "cacheNamespace": "test-cache-namespace"}'
```

## buildspec の例
<a name="caching-s3-examples"></a>

一般的な言語の buildspec の例を以下に示します。

**Topics**
+ [Node.js の依存関係をキャッシュする](#caching-s3-examples.nodejs)
+ [Python の依存関係をキャッシュする](#caching-s3-examples.python)
+ [Ruby の依存関係をキャッシュする](#caching-s3-examples.ruby)
+ [Go の依存関係をキャッシュする](#caching-s3-examples.go)

### Node.js の依存関係をキャッシュする
<a name="caching-s3-examples.nodejs"></a>

プロジェクトに `package-lock.json` ファイルが含まれており、`npm` を使用して Node.js の依存関係を管理する場合、次の例はキャッシュをセットアップする方法を示しています。デフォルトでは、`npm` は依存関係を `node_modules` ディレクトリにインストールします。

```
version: 0.2

phases:
  build:
    commands:
      - npm install
cache:
  key: npm-$(codebuild-hash-files package-lock.json)
  paths:
    - "node_modules/**/*"
```

### Python の依存関係をキャッシュする
<a name="caching-s3-examples.python"></a>

プロジェクトに `requirements.txt` ファイルが含まれており、pip を使用して Python の依存関係を管理する場合、次の例はキャッシュをセットアップする方法を示しています。デフォルトでは、pip はシステムの `site-packages` ディレクトリにパッケージをインストールします。

```
version: 0.2

phases:
  build:
    commands:
      - pip install -r requirements.txt
cache:
  key: python-$(codebuild-hash-files requirements.txt)
  paths:
    - "/root/.pyenv/versions/${python_version}/lib/python${python_major_version}/site-packages/**/*"
```

さらに、依存関係を特定のディレクトリにインストールし、そのディレクトリのキャッシュを設定できます。

```
version: 0.2

phases:
  build:
    commands:
      - pip install -r requirements.txt --target python-dependencies
cache:
  key: python-$(codebuild-hash-files requirements.txt)
  paths:
    - "python-dependencies/**/*"
```

### Ruby の依存関係をキャッシュする
<a name="caching-s3-examples.ruby"></a>

プロジェクトに `Gemfile.lock` ファイルが含まれており、`Bundler` を使用して gem の依存関係を管理する場合、次の例はキャッシュを効果的に設定する方法を示しています。

```
version: 0.2

phases:
  build:
    commands:
      - bundle install --path vendor/bundle
cache:
  key: ruby-$(codebuild-hash-files Gemfile.lock)
  paths:
    - "vendor/bundle/**/*"
```

### Go の依存関係をキャッシュする
<a name="caching-s3-examples.go"></a>

プロジェクトに `go.sum` ファイルが含まれており、Go モジュールを使用して依存関係を管理する場合、次の例はキャッシュを設定する方法を示しています。デフォルトでは、Go モジュールは `${GOPATH}/pkg/mod` ディレクトリにダウンロードされて保存されます。

```
version: 0.2

phases:
  build:
    commands:
      - go mod download
cache:
  key: go-$(codebuild-hash-files go.sum)
  paths:
    - "/go/pkg/mod/**/*"
```

# ローカルキャッシュ
<a name="caching-local"></a>

ローカルキャッシュは、そのビルドホストのみが利用できるキャッシュをそのビルドホストにローカルに保存します。キャッシュはビルドホストですぐに利用できるため、この方法は大規模から中間ビルドアーティファクトに適しています。ビルドの頻度が低い場合、これは最適なオプションではありません。つまり、ビルドパフォーマンスはネットワーク転送時間の影響を受けません。

ローカルキャッシングを選択した場合は、次のキャッシュモードを 1 つ以上選択する必要があります。
+ ソースキャッシュモードは、プライマリソースとセカンダリソースの Git メタデータをキャッシュします。キャッシュ作成後のビルドでは、コミット間の変更のみプルされます。このモードは、クリーンな作業ディレクトリと、大きな Git リポジトリであるソースを持つプロジェクトに適しています。このオプションを選択しても、プロジェクトで Git リポジトリ (AWS CodeCommit、GitHub、GitHub Enterprise Server、または Bitbucket) を使用しない場合、このオプションは無視されます。
+ Docker レイヤーキャッシュモードは、既存の Docker レイヤーをキャッシュします。このモードは、大きな Docker イメージを構築または取得するプロジェクトに適しています。そのため、大きな Docker イメージをネットワークからプルすることによって生じるパフォーマンス上の問題を回避できます。
**注記**  
Docker レイヤーキャッシュは Linux 環境でのみ使用できます。
プロジェクトに必要な Docker アクセス許可が付与されるように、`privileged` フラグを設定する必要があります 。  
デフォルトでは、Docker デーモンは非 VPC ビルドで有効になっています。VPC ビルドに Docker コンテナを使用する場合は、Docker Docs ウェブサイトの「[Runtime Privilege and Linux Capabilities](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)」を参照して、特権モードを有効にします。また、Windows は特権モードをサポートしていません。
Docker レイヤーキャッシュを使用する前に、セキュリティへの影響を考慮してください。
+ カスタムキャッシュモードは buildspec ファイルで指定したディレクトリをキャッシュします。このシナリオは、ビルドシナリオが他の 2 つのローカルキャッシュモードのいずれにも適していない場合に適しています。カスタムキャッシュを使用する場合: 
  + キャッシュに指定できるのはディレクトリのみです。個々のファイルを指定することはできません。
  + キャッシュされたディレクトリを参照するには、シンボリックリンクを使用します。
  + キャッシュされたディレクトリは、プロジェクトソースをダウンロードする前にビルドにリンクされます。キャッシュされたアイテムにより、同じ名前のソースアイテムが上書きされます。ディレクトリは buildspec ファイルのキャッシュパスを使って指定されます。詳細については、「[buildspec の構文](build-spec-ref.md#build-spec-ref-syntax)」を参照してください。
  + ソースとキャッシュで同じディレクトリ名は使用しないでください。ローカルにキャッシュされたディレクトリにより、ソースリポジトリ内の同じ名前のディレクトリの内容が上書きまたは削除される場合があります。

**注記**  
ローカルキャッシュは、環境タイプ `LINUX_GPU_CONTAINER` とコンピューティングタイプ `BUILD_GENERAL1_2XLARGE` ではサポートされていません。詳細については、「[ビルド環境のコンピューティングモードおよびタイプ](build-env-ref-compute-types.md)」を参照してください。

**注記**  
VPC で動作するように CodeBuild を設定する場合、ローカルキャッシュはサポートされません。CodeBuild で VPC を使用する方法については、「[Amazon Virtual Private Cloud AWS CodeBuild で を使用する](vpc-support.md)」を参照してください。

# ローカルキャッシュを指定
<a name="specify-caching-local"></a>

 AWS CLI、コンソール、SDK、または CloudFormation を使用して、ローカルキャッシュを指定できます。ローカルキャッシュの詳細については、「[ローカルキャッシュ](caching-local.md)」を参照してください。

**Topics**
+ [ローカルキャッシュの指定 (CLI)](#caching-local-cli)
+ [ローカルキャッシュの指定 (コンソール)](#caching-local-console)
+ [ローカルキャッシュの指定 (CloudFormation)](#caching-local-cfn)

## ローカルキャッシュの指定 (CLI)
<a name="caching-local-cli"></a>

の `--cache`パラメータを使用して AWS CLI 、3 つのローカルキャッシュタイプをそれぞれ指定できます。
+ ソースキャッシュを指定するには: 

  ```
  --cache type=LOCAL,mode=[LOCAL_SOURCE_CACHE]
  ```
+ Docker レイヤーキャッシュを指定するには: 

  ```
  --cache type=LOCAL,mode=[LOCAL_DOCKER_LAYER_CACHE]
  ```
+ カスタムキャッシュを指定するには: 

  ```
  --cache type=LOCAL,mode=[LOCAL_CUSTOM_CACHE]
  ```

詳細については、「[ビルドプロジェクトの作成 (AWS CLI)](create-project.md#create-project-cli)」を参照してください。

## ローカルキャッシュの指定 (コンソール)
<a name="caching-local-console"></a>

キャッシュは、コンソールの [**アーティファクト**] セクションで指定します。**[Cache type]** (キャッシュタイプ) で、**[Amazon S3]** または **[Local]** (ローカル) を選択します。[**ローカル**] を選択した場合は、3 つのローカルキャッシュオプションのうち、1 つ以上を選択します。

![\[3 つのローカルキャッシュオプションのうち 1 つ以上を選択して、ローカルキャッシュを指定します。\]](http://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/images/local-cache.png)


詳細については、「[ビルドプロジェクトの作成 (コンソール)](create-project.md#create-project-console)」を参照してください。

## ローカルキャッシュの指定 (CloudFormation)
<a name="caching-local-cfn"></a>

 CloudFormation を使用してローカルキャッシュを指定する場合は、 `Cache`プロパティで に `Type`を指定します`LOCAL`。次の YAML 形式の CloudFormation コード例では、3 つのローカルキャッシュタイプすべてを指定します。任意のタイプの組み合わせを指定できます。Docker レイヤーキャッシュを使用する場合は、`Environment` で、`PrivilegedMode` を `true`、`Type` を `LINUX_CONTAINER` に設定する必要があります。

```
CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: MyProject
      ServiceRole: <service-role>
      Artifacts:
        Type: S3
        Location: <bucket-name>
        Name: myArtifact
        EncryptionDisabled: true
        OverrideArtifactName: true
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/standard:5.0
        Certificate: <bucket/cert.zip>
        # PrivilegedMode must be true if you specify LOCAL_DOCKER_LAYER_CACHE
        PrivilegedMode: true
      Source:
        Type: GITHUB
        Location: <github-location>
        InsecureSsl: true
        GitCloneDepth: 1
        ReportBuildStatus: false
      TimeoutInMinutes: 10
      Cache:
        Type: LOCAL
        Modes: # You can specify one or more cache mode, 
          - LOCAL_CUSTOM_CACHE
          - LOCAL_DOCKER_LAYER_CACHE
          - LOCAL_SOURCE_CACHE
```

**注記**  
デフォルトでは、Docker デーモンは非 VPC ビルドで有効になっています。VPC ビルドに Docker コンテナを使用する場合は、Docker Docs ウェブサイトの「[Runtime Privilege and Linux Capabilities](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)」を参照して、特権モードを有効にします。また、Windows は特権モードをサポートしていません。

詳細については、「[ビルドプロジェクトの作成 (CloudFormation)](create-project.md#create-project-cloud-formation)」を参照してください。