GitHub Actions よくわからず間違った使い方をしていた


背景

GitHubにプッシュをした際、きちんと整形されているかどうか、実行エラーが出ないかなどの簡単な自動テストをしようと思った。その際、GitHub ActionsとECSが連携していることを知り、ECSでテスト実行しようと思った。しかし動作確認をしているうち、

GitHub側でエラーが出ていないのに、なぜタスクが実行されないのか
(後ほど書くが、サービスのタスクの数を0に設定していたから)

という問題にぶつかった。朝早くから何度も設定を見直して動作確認を繰り返したり、夜遅くまでうまくいかない原因を必死にググっていた。

そして昨日、ついにGitHub ActionsとECSの連携はWebアプリケーションを手軽にデプロイするサービスであることを知った。というか先輩から教えてもらった。その先輩はこのサービスを使ったことがないのにも関わらず、プッシュ時の自動テスト用ではないことを瞬時に見抜いた。そのときの自分はすごく無様だった・・・。せっかくいろいろ調べたしそのうち使うかもしれないので記事にしておく。

Webサイトのデプロイ

1. リポジトリを作成する

GitHubに新しいリポジトリを作成する。

2. DockerFileを作成する

デプロイ用のDockerfileを作成する。公式ドキュメントにあるDockerfileを用いる。

FROM ubuntu:18.04

COPY ./index.html /var/www/html/
COPY ./run_apache.sh /root/

RUN apt-get update && \
    apt-get -y install apache2 && \
    chmod 755 /root/run_apache.sh

EXPOSE 80

CMD ["sh", "/root/run_apache.sh"]

以下のrun_apache.shとindex.htmlもDockerfileと同じ階層に入れておく。

run_apache.sh
. /etc/apache2/envvars
mkdir -p /var/run/apache2
mkdir -p /var/lock/apache2
/usr/sbin/apache2 -D FOREGROUND
index.html
<h1>Hello World!</h1>

以下の画像は現在のリポジトリの状態

3. GitHub Actions

1.Actionsを選択

2.Deploy to Amazon ECSを選択

3.start commit を選択し、Commit new fileを選択

現在のリポジトリの状態

4. ECRにリポジトリを作成する

こちらの記事を参考にリポジトリを作成する。

5. クラスター、タスク定義、サービスを作成する

クラスター、タスク定義の作成

こちらの記事を参考に作成する。

サービスの作成

1.作成したタスク定義、クラスターを選択し、任意のサービス名を入力

2.タスクの数を入力。これは常時いくつのタスクを実行状態に保つか、という値。1にすれば常時1つのタスクを実行状態にしてくれる。ただ、タスクの実行が終了すれば、そのタスクは停止する。その後、タスクの数1を保とうとして自動でタスクが実行される。

この値を0にしていると、GitHub Actionsでデプロイしてもタスクが実行されない

3.スケーリング

これはサービス作成後に修正するが、今はデフォルト。

4.サービス更新

4-1. 先ほど作成したサービスを選択し更新を選択する

4-2. 「サービスの必要数を調整する」を選択する

4-3. タスクの最大数を1にすることで、実行状態にあるタスクは高々1つになる。

こうしている間にもタスクがどんどん起動されている。リポジトリを作成しただけでイメージは格納されていないのでエラー終了している。

6. task-definition.json の作成

以下のようにJSON形式でタスク定義を見ることができる。これをコピペすればよいが、不要なキーが多くある。

以下のように必要なキーだけを記述する。

task-definition.json
{
  "executionRoleArn": "arn:aws:iam::012345678912:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/git-task",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "image": "image:latest",
      "essential": true,
      "name": "container"
    }
  ],
  "memory": "512",
  "family": "git-task",
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "256"
}

7. アクセスキーID・シークレットアクセスキーの登録

こちらに作成方法が書いてある。AWS_ACCESS_KEY_ID 、AWS_SECRET_ACCESS_KEY を登録する。

デバッグを行うために次の2つのシークレットを作成しておく。ACTIONS_RUNNER_DEBUG、ACTIONS_STEP_DEBUG の値をtrueで登録する。参考記事はこちら。

Settings → Secrets → Name, Valueを入力
という流れ。Valueに認証情報を貼り付ける。

8. GitHub Actions aws.yml の編集

以下5つのキーを書き換える。

aws-region: ap-northeast-1
ECR_REPOSITORY: my-repo
container-name: container
service: git-service
cluster: git-test

後はpush時にデプロイできるように以下の部分を修正する。

修正前

on:
  release:
    types: [created]

修正後

on:
  push:
    branches: [main]

↑ mainにはどのブランチをデプロイするか適宜修正する。
これをpushすれば、早速デプロイが始まる。成功すれば以下のように緑のチェックが表示される。

タスクのパブリックIPに80ポートでアクセスし、デプロイを確認する。(セキュリティグループのインバウンドルールに、自分のIPアドレスを登録する)

参考記事