CircleCIで要dockerのcdk deployする


cdk deploy でdockerが必要になることがあります。(少なくともlambdaのpythonランタイムのデプロイでは必要だった)
CircleCIで要dockerのcdk deployを実現しようとしてハマったので方法を共有します。

Executor Type

Executor Typeはmachineを選択します。
私は既存のデプロイ環境を元にExecutor Typeをdockerとして、実現方法を探し始めました。
以下の2つのアプローチをしましたが、どちらも中々うまく行かず断念しました。

ダメ1

  • Executor Typeは docker
  • setup_remote_dockerを使う
  • AmazonLinuxベースのdockerを実行環境として、Docker in Docker(以下dind)できるようにしてトライ。

だめな理由

setup_remote_dockerを使って立ち上がるdockerに、ディレクトリのマウントが出来ないことに起因するcdk deployの失敗。(たぶん)

ダメ2

  • ダメ1を元に、ディレクトリのマウントも自由にできるという ECRにdocker:dindベースのイメージを作りそれをexecutorとする方法。

だめな理由

  • このイメージを実行する時に--privilegedしないと、dindが実現できないと思われる
  • しかし--previledgedを指定してコンテナ(CircleCIの実行環境)を起動する方法がわからなくてCircleCI上でdind出来なかった

具体的な実現方法

実際はもっと複雑ですが、要素だけ抜き出すとこんなconfig.ymlで実現できました。

version: 2.1
orbs:
  # cdkの実行に必要
  node: circleci/[email protected]
jobs:
  deploy:
    machine:
      image: ubuntu-2004:current
    steps:
      - checkout
      - node/install:
          install-yarn: true
          node-version: '16.13'
      # docker使えるか確認
      - run: docker info 
      - run: npm ci && cdk deploy

orbがあるので無理にカスタムdockerイメージを使う必要性がだいぶ少なくなっているのかもしれません。

まとめ

そもそもmachineで調べ始めたらこんな苦労はなかったんだな