🐑
GitHub ActionsでOpenID Connect(OIDC)を使ったEC2自動デプロイ
はじめに
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 'デプロイ完了'
その他
- EC2にSSMエージェントがインストールされて、起動していることを確認しておく(EC2にセッションマネージャー経由でログインできれば問題なし)
- EC2にログインして事前にGit Cloneできる状態にしておく
おわりに
pushイベントをトリガーにEC2へ自動デプロイできました!
Discussion