[小ネタ]CodeBuild で aptのパッケージダウンロードを強引にキャッシュしてみた

福岡オフィスの梶原(ambasad)です

タイトル通りですが、なかなか一筋縄ではいかなかったので、公開します。
基本的には、CodeBuildのダウンロード速度は遅くないのでキャッシュせずに使うのが下手にはまらずにいいかと思います。また、ダウンロードにかかる時間等は稼げるかもしれませんが、キャッシュしたパッケージファイルは、パッケージが新しくなるにつれ、古いものもが溜まっていくのでどこかでメンテナンスが必要となります。
本来であれば、ビルド専用のImageを作成して、そちらを使用する方がおすすめです。

以上を認識したうえで、敢えてやる理由としては

  • 専用のビルド用のImageをつくるまでもない
  • ダウンロードにかかる時間をほんの少しでも少なくしたい
  • CodeBuildのキャッシュ使ってみたい
  • aptの設定に詳しくなりたい(後付け)
  • メンテナンスはちゃんとする

などのモチベーションがあるかたの役に立つと幸いです。 では、サクサク行きます。

必要なもの

  • AWSアカウント
  • キャッシュ用のS3バケット

buildspec.yml

ポイントはaptのキャッシュが置かれる /var/cache/apt/archives 配下をCodeBuildのキャッシュを指定しS3にいれることと apt-upgrade の環境変数でapt.confを指定し、既存の設定を上書きしています。

buildspec.ymlはこんな感じになります。

version: 0.2

phases:
  install:
    commands:
      - echo $APT_CONF > apt.conf
      - apt-get update -c apt.conf
      - apt-get upgrade -y -c apt.conf
      - apt-get install cargo -y -c apt.conf
  pre_build:
    commands:
      - rustc --version
cache:
  paths:
    - '/var/cache/**/*'

ポイントは -c で指定しているapt.confです。
なんで、こんなことしてんのか?ってことですが 本来ならばbuildspec.ymlのcacheで/var/cache/を指定すればいいと思ったのですが1筋縄ではうまくいかず。 aptの動きを調べたところ、前処理でパッケージがダウンロードされているディレクトリを消してるようです。 ですので、apt-updateのコマンドの前処理を無効にしちゃってます。 環境変数もうまくいかず、上手くいったのは-cで設定ファイルを指定した場合でした。 ちょっと大廻してますが $APT_CONFを環境変数で指定し、apt.confを作成しています
buildspec.ymlで作成しなければ、同ディレクトリにapf.confを置いてください

apt.conf

#clear "APT::Update::Post-Invoke";
#clear "DPkg::Post-Invoke";

やってみる

CodeBuildのapt-get upgrade -y -c apt.conf 部分のログの抜粋ですが

1回目のビルド

Need to get 114 MB of archives.
After this operation, 11.8 MB of additional disk space will be used.
Get:1 http://ppa.launchpad.net/git-core/ppa/ubuntu/ trusty/main git amd64 1:2.20.1-0ppa1~ubuntu14.04.1 [5468 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/main dpkg amd64 1.17.5ubuntu5.8 [1958 kB]
Get:3 http://archive.ubuntu.com/ubuntu/ trusty-updates/main perl amd64 5.18.2-2ubuntu1.7 [2650 kB]
・・・省略 

で100MBほどダウンロードされているパッケージが2回目のBuildではスキップされています。

2回目のビルド

Need to get 0 B/114 MB of archives.
After this operation, 11.8 MB of additional disk space will be used.```

まとめ

CodeBuildよりもどちらかと言えば、apt.confの既存設定のクリアの書き方がなかったので困りました。 CodeBuildの今後のアップデートで大事な前処理が入る可能性はありますので、ご利用は計画的に。

参考

apt.conf - APT の設定ファイル https://manpages.debian.org/jessie/apt/apt.conf.5.ja.html