概要
Rails
の環境をECS
で作成する際、多くの開発者がmaster.key
をコンテナーに環境変変数として設置すると思います。この方法でも問題ないですが、コンテナーの環境変数を使用したくないと言う要望もあるかと思い、表題の方法について手順を書きたいと思います。
前提条件
-
Docker
のバージョンが18.09
以上である -
Ruby on Rails
の環境がある -
GitHub Actions
が導入されている -
Docker
を使用して、Ruby on Rails
の環境立ち上がっている
GitHubの設定
-
Settings
を押下すると、サイドバーにSecrets and variables
がある。その中にActions
がある為、そこに環境変数を入れる
-
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
)をECR
のimage
に安全に渡す事ができる
(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は環境変数に設定する事を推奨する
Dockerfile
-
Dockerfile
でもBuildKit
を使用して、image
を作成する
# master.keyをコピー
RUN --mount=type=secret,id=master_key,target=master.key,required=true \
rails assets:precompile RAILS_ENV=Production
参考資料
- Railsのcredentials.yml.encとmaster keyをDockerで安全に扱う
- docker buildkitを使いecsで本番モードでrailsを起動させる方法(master.keyの配送方法など)
- docker buildx build
- buildx を使ったビルド
まとめ
GitHub Actions
の理解やBuildKit
と言うDockerの新たな機能について知見が増えました。BuildKit
に関して、セキュアなコンテナーを作成する以外にも様々使い道がありそうなので、いろいろい試して見たいと思います。