4
1

More than 3 years have passed since last update.

NuxtをGithub Actions、ECR、ECSでCI/CDさせるまで

Last updated at Posted at 2020-07-31

はじめに

WebGL課題が大学であった。そこでNuxtでSSRできたらスマーフォンからでも重い映像を描画できるんじゃないかと思い、見切り発車することにした。その際にCI/CDパイプライン作って、ECS、ECRの自動化チャレンジしたらさらに面白いんじゃないかってことでやってみた。

成果物のgit: https://github.com/yCroma/WebGL.git

内容

  1. DockerのMultipleCompose
  2. Makefileでシェルを叩く
  3. ECR、ECS
  4. Github ActionsでのCI/CD
  5. おまけ(Dockerfile,docker-composeの連携)

1. DockerのMultipleCompose

参考は以下の通り。
docker-compose.ymlをDRYに書くテクニック2選
Share Compose configurations between files and projects

何ができるかって言うと、複数のcomposeファイルを1つのファイルのようにして処理することができるようになる

.
├── docker
│   ├── dev
│   │   ├── Dockerfile
│   │   └── docker-compose.dev.yml
│   └── prod
│       ├── Dockerfile
│       └── docker-compose.prod.yml
└── docker-compose.yml

こんなファイル群があったときに、開発用のdevのcomposeファイルだけ利用したいという場合。

$ docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

みたいな感じで利用することができる。これにより、ビルド用のファイルと開発環境用のファイルを分けて実行することができるからとても便利。
でも実際こんな長ったらしいコマンドを叩くのは面倒くさい。今回の例だと、Makefileとcommandsのなかに用意したshellファイルを実行することによって避けるようにしている。

2.Makefile

すごくシンプルなもので、長ったらしくなるコマンドをMakefileとshellのみで完結させた話。
.envファイル内に環境変数を用意して、shellで読み込み実行できるようにする。用意したshellをMakefileから叩く。

3. ECR、ECS

これはECRへのpushが詰まった。ログインが必要になるのだが、AWS Cli v2を使っていたのでaws ecs loginみたいなコマンドが使えなかった。クラスメソッドさんの記事のおかげで解決することができた。

記事:[アップデート]AWS CLI v2 で $ aws ecr get-login を使うときの注意点

aws ecr get-login-password | docker login --username AWS --password-stdin https://<< AWSのアカウントID >>.dkr.ecr.<< region >>.amazonaws.com

注意点としては、--usernameはAWSであること。気を利かせて、自分のユーザー名とか入れると失敗する。

ECSに関しては、以下を参考にした。

構成とやり方
【Nuxt.js】AWS ECR/FargateにデプロイするためのDockerイメージ作成方法
nuxtプロジェクトを独自ドメインでSSR(CloudFront -> ALB -> Fargate)

タグ付、push
Nuxt.jsでアプリ作成→Dockerfileを使ってイメージ作成→fargateでデプロイ→ドメイン設定・SSL化まで

4. Github ActionsでのCI/CD

結論から言うと、一回のCI/CDで約10分かかった。ここは更新点。
基本的に参考にしたのは、以下の記事。
GitHub ActionsからサクッとFargateにデプロイしてみた
GitHub ActionsからAmazon ECSにアプリをデプロイ
1つだけこだわったとこがあり、task-difinition.jsonをローカルで保存しないようにした。このおかげで、task-difinition.json内にアカウントのIDなど見られたくないものがあった場合でも安心。

task-difinitionの参考:Amazon ECS "Deploy Task Definition" Action for GitHub Actions

おまけ(Dockerfile,docker-composeの連携)

docker-composeからDockerfile内に環境変数を渡す方法が浮かばなかった。答えとしては、ARGで受け取ってENVで宣言すれば良かったらしい。

docker-composeのビルド中に環境変数が認識されない
Dockerfileの"ENV"と"ARG"と"環境変数"について

あとdocker-composeで任意のイメージ名を指定する方法。

Docker Composeでビルド時に任意のイメージ名を指定する方法

おわりに

デプロイに10分かかってしまうのはあれだが、やはり快適だ。いずれは、Terraformを使って完全自動化を目指したい。

4
1
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
4
1