Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actionsとdockerを使用して、ECRのイメージに、安全にmaster.key を含める方法

Last updated at Posted at 2024-04-05

概要

Railsの環境をECSで作成する際、多くの開発者がmaster.keyをコンテナーに環境変変数として設置すると思います。この方法でも問題ないですが、コンテナーの環境変数を使用したくないと言う要望もあるかと思い、表題の方法について手順を書きたいと思います。

前提条件

  • Dockerのバージョンが18.09以上である
  • Ruby on Railsの環境がある
  • GitHub Actionsが導入されている
  • Dockerを使用して、Ruby on Railsの環境立ち上がっている

GitHubの設定

  • Settingsを押下すると、サイドバーにSecrets and variablesがある。その中にActionsがある為、そこに環境変数を入れる

githubの画像.png

  • GitHubの権限設定によっては、settingsの管理画面が見れない可能性があります。その場合は、管理者に問い合わせて下さい
  • 必要に応じて環境変数を作成して下さい

GitHub Actions

  • configのディレクトリーに、master.keyのファイルを作成する
  • master.keyのファイル内に、暗号化キーを書き込む
.github./workflows/deploy.yml
- name: Create rails master key for build
  run: |
    touch $GITHUB_WORKSPACE/config/master.key
    echo ${{ secrets.RAILS_MASTER_KEY }} > $GITHUB_WORKSPACE/config/master.key

# $GITHUB_WORKSPACE: .githubが置いてある場所をルートディレクトリーと定義している
  • envに 環境変数を設定する
  • Dockerのバージョンが18.09以降であれば、BuildKitと言う機能を使う事ができる
  • BuildKitの機能を使用する事で、秘密情報(今回の場合、master.key)をECRimageに安全に渡す事ができる
    (imgae内に、master.keyの情報が含まれない為、imageからmaster.keyの情報が漏洩しない)
.github./workflows/deploy.yml
- name: Build, tag, and push image to Amazon ECR
  id: build-image
  env:
    DOCKER_BUILDKIT: 1
    ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
    REPOSITORY: "<ECRリポジトリ名>"
    IMAGE_TAG: ${{ github.sha }}-${{ github.run_id }}
  run: |
    docker buildx create --use
    docker buildx build \
      --secret id=master_key,src=$GITHUB_WORKSPACE/config/master.key \
      -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \
      --push \
      -f containers/production/Dockerfile .
    echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

# -f containers/production/Dockerfile . :各々のリポジトリーの構成に合わせて修正して下さい

REPOSITORYは環境変数に設定する事を推奨する

BuildKitの概要

  • Dockerイメージのビルドや他のビルドプロセスを効率的に行う為のツール
  • 通常のビルドよりも並列処理やキャッシュの利用が優れており、ビルド時間を大幅に短縮できるのが特徴
  • BuildKitは、buildkitd(デーモン)とbuildctl(クライアント)から構成されている

主な機能

  • キャッシュ効率の向上 : ビルドの各ステップを細かくキャッシュし、再ビルド時には変更された部分だけを再実行する。これにより、無駄なビルドを避け、時間を短縮出来る

  • 並列処理 : 複数のビルドステップを並列に実行する事ができ、CPUリソースを効率的に活用出来る。これにより、ビルドの速度が向上する

  • Dockerfileを使った柔軟なビルド : Dockerfileをビルドの定義として利用するが、独自の中間フォーマット(LLB)に変換してビルドを実行する。これにより、複雑な依存関係の管理が簡単になる

  • シークレットやSSHキーの安全な取り扱い : ビルド時にシークレットファイル(例: APIキー)やSSHキーを安全に取り扱う事が出来る。ビルドの際、外部に機密情報が漏れなくなる為、セキュリティが強化出来る

補足

  • buildkitd(デーモン) : BuildKitのビルドエンジンとして機能している。リクエストを受け取って、ビルドを実行し、ビルドの各ステップを処理する
  • buildctl(クライアント) : ユーザーがビルドリクエストを送信する為のインターフェース。ユーザーがCLIを使ってビルドを開始したり、オプションを設定したりする際に、このbuildctlコマンドを使用する
  • LLB(Low-Level Build) : ビルドの処理手順や依存関係を効率的に管理する為の中間フォーマット。通常、Dockerfileを使ってビルドを行う際、各コマンド(FROM, RUN, COPYなど)はそのまま実行されるが、BuildKitはこれらの命令を一旦LLB形式に変換してからビルドを実行する

Dockerfile

  • DockerfileでもBuildKitを使用して、imageを作成する
# master.keyをコピー
RUN --mount=type=secret,id=master_key,target=master.key,required=true \
    rails assets:precompile RAILS_ENV=Production

コマンドの叩き方

# Dockerfileのファイルパスを指定するコマンド
DOCKER_BUILDKIT=1 docker build --no-cache --secret id=master_key,src=path/to/master.key -t rilas_image -f build_files/porduction/Dockerfile .

# または
# Dockerfileのがカレントディレクトリにある場合のコマンド
DOCKER_BUILDKIT=1 docker build --no-cache --secret id=master_key,src=path/to/master.key -t rilas_image .

コマンドの構造

  • BuildKitを有効にする為の環境変数。このオプションを設定すると、BuildKitの機能が使用可能となる
DOCKER_BUILDKIT=1
  • Dockerイメージをビルドする標準的なコマンド
docker build
  • キャッシュを使わずに、常に新しいビルドを行うオプション。BuildKitはキャッシュ機能が強力ですが、キャッシュを使いたくない場合に下記を指定する
--no-cache
  • ビルド中に シークレット情報(ここでは master_key)を安全に使う為の仕組み。path/to/master.keyというファイルに保存された秘密情報(例: APIキーや暗号キー)をDockerビルド中で参照するが、この情報は外部に漏れない様に保護された状態で処理される。シークレット情報は、ビルドが終わると自動的に削除され、外部には見えない様になる
  • 要約 : ビルド中に一時的に鍵やパスワードを使いたい際、セキュリティを確保しながらそれらを渡す方法
--secret id=master_key,src=path/to/master.key

# 相対パスの書き方 : src=path/~/master.key
# 絶対パスの書き方 : src=/Users/test/path/~/master.key
# 先頭に/が入ると絶対パスでの指定になる

出力されるDockerイメージにrails_imageという名前を付与する。名前は任意で決めてよい

-t rails_image
  • 現在のディレクトリをビルドコンテキストとして指定する。現在のいるディレクトリからDockerfileを探す
.
  • ビルドに使用するDockerfileの場所を指定する
-f build_files/porduction/Dockerfile .

参考資料

まとめ

GitHub Actionsの理解やBuildKitと言うDockerの新たな機能について知見が増えました。BuildKitに関して、セキュアなコンテナーを作成する以外にも様々使い道がありそうなので、いろいろい試して見たいと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?