GitHub ActionsからサクッとFargateにデプロイしてみた

つい先月GitHub ActionsがGAし、GitHub単体でお手軽にCI/CDができるようになっています。 あまり触れられていない気がしますが、AWS公式からもGitHub Actionsをいい感じに使えるテンプレートが公開されていますので、今回はこのテンプレートを使ってFargate環境にデプロイして見たいと思います!
2019.12.12

REALFORCEのMacテンキーレス版、US配列(!)が2019/12/12より発売するとのことで、首を長くして待っているもこ@札幌オフィスです。

つい先月GitHub ActionsがGAし、GitHub単体でお手軽にCI/CDができるようになっています。

あまり触れられていない気がしますが、AWS公式からもGitHub Actionsをいい感じに使えるテンプレートが公開されていますので、今回はこのテンプレートを使ってFargate環境にデプロイして行こうと思います!

Amazon Elastic Container Service で複数の GitHub Actions が公開

テンプレートから作成していく

早速やっていきましょう。

リポジトリ > Actions からDeploy to Amazon ECSを選択します。

こんな感じでテンプレートが作られるので、右上からMasterブランチにコミットしていきましょう。

リポジトリをcloneしてきましたら、生成されたaws.ymlを開きます。

今回は東京リージョンのECSクラスターにデプロイしたいため、デフォルトではus-east-2となっているリージョン設を、東京リージョン(ap-northeast-1)に変更します。

お次はSecretsの設定です。

GitHub上にAWSのIAM Userの認証情報を設定します。

デプロイに使うIAM UserにはECRとECS周りの権限が必要なので、GitHub Actions用に払い出しましょう。

設定が終わったらActionsから「Re-run checks」で再実行してあげましょう。

とりあえず「Login to Amazon ECR」まで進んでればOKです。

テスト用のDockerfile / taskDefinitionを用意する

何はともあれDockerfileが無いと始まりません。

ひとまずリポジトリディレクトリ直下にNginxコンテナのDockerfileを作りました。

FROM nginx:mainline-alpine

ローカルで実行して正常に動作することを確認します。

docker build -t test-nginx. && docker run -p 8080:80 test-nginx

ECRの作成

ECRのリポジトリを作っていきます。

今回は githubactions-nginx としました。

taskDefinitionの作成

次はtaskDefinitionです。

環境によって違うとは思いますので都度更新が必要ですが、こんな感じのを作ります。

imageは置き換わるため、適当で大丈夫です。

{
  "family": "nginx",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "nginx",
      "image": "nginx",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "essential": true
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "executionRoleArn": "ecsTaskExecutionRole",
  "cpu": "256",
  "memory": "512"
}

task-definition.json として保存します。

※このテンプレートはネットワークモードが「awsvpc」しか対応していない点にご注意ください!

ネットワークモードの詳細については下記にて詳しくご紹介されているので、合わせてご確認ください。

ECSでEC2インスタンスを利用する際のネットワークモードについて調べてみた

GitHub Actions Workflowの更新

最後にGitHub ActionsのWorkflowを修正していきます。

ECR_REPOSITORY を先ほど作成したECRのリポジトリ名に変更、 container-name, service, cluster を実際の環境と合わせて設定します。

最終的な差分はこんな感じになりました。

動作確認

デプロイが終わるとこんな感じでオールグリーンになります。

ECSの画面からTaskが正常にRUNNINGになっていることを確認できます!

ALBのエンドポイントを叩いてみて、正常にWelcome to nginx!が帰ってくることを確認します!

まとめ

AWS公式で公開されてるGitHub Actionsのテンプレートを利用することで簡単にコンテナをデプロイすることができました!

GitHub ActionsではもちろんAWS CLI / ECS CLIをインストールしてコンテナをビルド、ECS CLIでデプロイをするようなスクリプトを流すこともできますが、AWSが提供してくれているテンプレートを利用すると圧倒的楽に作ることができました!

検証したリポジトリはこちらで公開しているので、ぜひご参照ください!

https://github.com/mokocm/ecs-deploy-githubaction

以上、もこでしたー。