AWS CodeBuild でローカルキャッシュを使用する場合の注意点

記事タイトルとURLをコピーする

冬も終わりですね
写真は谷川岳ロープウェイからの谷川岳です
f:id:swx-yamamoto:20220319122810p:plain

前提

AWS の Code系サービスを使った ソースコード管理・ビルド(コンパイル)・デプロイ(環境への展開) は
基本的に以下の図のようになります

f:id:swx-yamamoto:20220319110211p:plain 正式なサービス名:
AWS CodeCommit 、AWS CodeBuild 、AWS CodeDeploy、AWS CodePipeline

やろうとしたこと

  • 一度ビルドした結果ファイルをCodeBuild にキャッシュしておき ビルド時間を短縮する
    • AWS CodeCommit のソースコードを毎回全てビルドする必要はない
      • 毎回のビルドが不要なバイナリを 最初のビルド時にCodeBuild にキャッシュしておき全体のビルド時間を短縮する

f:id:swx-yamamoto:20220319111251p:plain

CodeBuild にキャッシュする方法

AWS公式ドキュメントに記載のあるキャッシュ方法としては以下の 2種類があります

  1. Amazon S3 にキャッシュ
  2. CodeBuilがビルドする際に使用するホスト上にキャッシュ(ローカルキャッシュ)

ドキュメント:AWS CodeBuild でのキャッシュのビルド - AWS CodeBuild

図に示すと以下のようになります
f:id:swx-yamamoto:20220319115721p:plain

「1. Amazon S3 にキャッシュ」を選択する際の注意点としまして
CodeBuild が S3 にキャッシュしたファイルを S3 からネットワーク経由でダウンロードします
そのため ビルドする時間 よりも ダウンロードする時間のほうが短い場合に有効な手段です
キャッシュしたファイルをダウンロードする時間については
ネットワークパフォーマンスやファイルサイズ・数等も関係してくるため
実際に計測してみて判断するしかありません

ローカルキャッシュする際の注意点

「2. CodeBuilがビルドする際に使用するホスト上にキャッシュ(ローカルキャッシュ)」を選択する際の注意点に関して見ていきます
この記事の本題です

f:id:swx-yamamoto:20220319120122p:plain

CodeBuild のビルド処理に 前回と同一のホストが割り当てられた場合のみしかキャッシュが効かない

実際に使用してみるとキャッシュが効かないという問題が出ました
そのため AWS サポートに問い合わせたところ 以下のような回答を得ました

  • ローカルキャッシュ機能は使用されない場合がある
    • ローカルキャッシュは、前回と同一のホストが割り当てられた場合のみ機能するため、異なるホストが割り当てられた場合は機能しない
      • 同一のホストが割り当てられる条件等は公開していない
      • 同一のホストが割り当てられるようにするオプション等もない
  • 確実にキャッシュを使用できる必要がある場合は Amazon S3 のキャッシュを使用すること

というわけでローカルキャッシュをあてにしない方が良さそうです

検証に使った buildspec.yml

とてもシンプルに検証しました

  1. /yamamoto-temp というディレクトリをローカルキャッシュ用のディレクトリにしました (cache セクション)
  2. ホスト名を出力
  3. /yamamoto-temp/test.txt を ls - l して存在確認 (キャッシュが効いている場合には存在する想定)
  4. /yamamoto-temp/test.txt を作成 (既に存在する場合にはタイムスタンプを更新)
  5. /yamamoto-temp/test.txt を ls - l して存在確認 (作成したファイルが有ることを確認)
version: 0.2
phases:
  pre_build:
    commands:
      - echo Start
  build:
    commands:
      - uname -n
      - ls -l /yamamoto-temp/test.txt || echo "not cached"
      - touch /yamamoto-temp/test.txt
      - ls -l /yamamoto-temp/test.txt || echo "not created"
  post_build:
    commands:
      - echo Finished
cache:
  paths:
   - '/yamamoto-temp/'

検証結果画面

1回目:キャッシュを作成 f:id:swx-yamamoto:20220319121534p:plain

2回目:同一ホストなら1回目のキャッシュが見える予定 → 異なるホストでした f:id:swx-yamamoto:20220319121957p:plain

3回目:同一ホストなら2回目のキャッシュが見える予定 → 異なるホストでした f:id:swx-yamamoto:20220319122434p:plain

10回ほど試したものの 全て異なるホストだったため キャッシュした瞬間を見れませんでした

まとめ

AWS CodeBuild でローカルキャッシュする際の注意点として
「CodeBuild のビルド処理に 前回と同一のホストが割り当てられた場合のみしかキャッシュが効かない」
ということが分かりました
誰かの役に立つことを祈っています

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、サウナ、音楽鑑賞(J-Pops)、お笑い鑑賞(ラランド)