🐑

GitHub ActionsでOpenID Connect(OIDC)を使ったEC2自動デプロイ

2024/10/20に公開

はじめに

GitHub Actionsを使ったEC2への自動デプロイを実装しました。これまでGitHubの経験はあまりなかったのですが、ポイントだけ抑えればOIDCを使って簡単にデプロイできました。

よりセキュアな方法だったり、運用に使うレベルであれば考慮するべき点は沢山あると思いますが、とりあえず試してみるというレベルであればそこまで難しくありませんでした。
※AWS SSMを使用してコマンドを実行する方法を採用しています。
それではやっていきます。

実装

1. IDプロパイダを作成する


IAM > IDプロパイダ > プロパイダを追加 をクリック。

  • プロバイダURL:https://token.actions.githubusercontent.comを指定。
  • 対象者:sts.amazonaws.comを指定。
  • プロパイダを追加 をクリック。
    ※ 設定値はGitHub Actions公式を参照

2.IAMロールを作成する

  • 信頼されたエンティティタイプ: カスタム信頼ポリシー をクリック。
  • 以下のようなJSONを入力。

今回はロール名をGitHubActionsRollとしておく。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GitHubActions",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<アカウントID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:<リポジトリ名>:*"
                }
            }
        }
    ]
}

便宜的にConditionでは、特定のリポジトリの全てのワークフローから認証を許可してるが、必要な範囲だけに絞った方がベター。

3.GitHub Actionsの作成

.github/workflows/app-server-deploy.yml
name: app-server-deploy

on:
  push:
  workflow_dispatch:

permissions:
  contents: read
  id-token: write

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: 'ap-northeast-1'
          role-to-assume: 'arn:aws:iam::<アカウントID>:role/GitHubActionsRoll'

      - name: ssm send-command
        run: |
          RESPONSE=$(aws ssm send-command \
            --instance-ids ${{ secrets.INSTANCE_ID }} \
            --document-name "AWS-RunShellScript" \
            --parameters '{"commands": ["sudo su - ec2-user -c \"cd /var/www/testRepo && git pull\""]}')
          echo "$RESPONSE"
      - name: deployed message
        run: echo 'デプロイ完了'

https://docs.aws.amazon.com/cli/latest/reference/ssm/send-command.html

その他

  • EC2にSSMエージェントがインストールされて、起動していることを確認しておく(EC2にセッションマネージャー経由でログインできれば問題なし)
  • EC2にログインして事前にGit Cloneできる状態にしておく

おわりに

pushイベントをトリガーにEC2へ自動デプロイできました!

Discussion