はじめに
GitHub Actions を使って AWS にデプロイする際、従来は AWS_ACCESS_KEY_ID と SECRET_ACCESS_KEY を GitHub シークレットに保存して使用していました。しかし、この方法はセキュリティリスクがあり、管理の手間もかかります。この記事では、これを OIDC (OpenID Connect) を使ってより安全かつ管理しやすい方法に置き換える手順を解説します。対象読者は、AWS と GitHub Actions を使用しているエンジニアです。この手法を使うことで、以下のことが可能になります。
- AWS IAM ユーザーのキー管理を不要に
- OIDC を用いたセキュアな認証
- GitHub Actions からの安全な AWS リソース操作
環境
- AWS アカウント
- GitHub アカウント
- Terraform v1.x
IAM Identity Provider の作成
まず、AWS マネジメントコンソールで IAM Identity Provider を作成します。これにより、GitHub の OIDC プロバイダーを AWS に登録します。
- AWS マネジメントコンソールにログインし、IAM サービスを開きます。
- 左のメニューから "Identity providers" を選択し、"Add provider" をクリック。
- Provider type を "OpenID Connect" に設定し、以下の情報を入力します。
- Provider URL:
https://token.actions.githubusercontent.com - Audience:
sts.amazonaws.com
- Provider URL:
IAM Role の作成と Trust Policy の設定
次に、GitHub Actions から AWS リソースを操作できる IAM Role を作成します。この Role の Trust Policy に OIDC プロバイダーと GitHub リポジトリを指定します。
# trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:<YOUR_GITHUB_REPO>:ref:refs/heads/main"
}
}
}
]
}
IAM Role を Terraform で作成する場合の例:
# main.tf
resource "aws_iam_role" "github_actions" {
name = "github-actions-role"
assume_role_policy = file("trust-policy.json")
}
resource "aws_iam_role_policy_attachment" "attach_policy" {
role = aws_iam_role.github_actions.name
policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess"
}
GitHub Actions の設定
続いて、GitHub Actions のワークフローで AWS 認証を設定します。aws-actions/configure-aws-credentials を使います。
# .github/workflows/deploy.yml
name: Deploy to AWS
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: arn:aws:iam::<ACCOUNT_ID>:role/github-actions-role
aws-region: us-west-2
- name: Deploy to S3
run: |
aws s3 sync . s3://<YOUR_BUCKET> --delete
ハマったポイント / トラブルシュート
OIDC プロバイダー URL の間違い
OIDC プロバイダーの URL は https://token.actions.githubusercontent.com である必要があります。これを間違えると、AssumeRole が失敗します。
Trust Policy の条件設定
Trust Policy の sub クレームは、repo:<YOUR_GITHUB_REPO>:ref:refs/heads/main で指定する必要があります。これをミスすると、特定のブランチからしかデプロイできません。
まとめ
GitHub Actions を用いた AWS デプロイを OIDC によってよりセキュアに行う方法を紹介しました。IAM ユーザーを廃止し、OIDC によるフェデレーションを利用することで、アクセスキーの管理を簡素化できます。次に取り組むべき課題としては、さらに細かい IAM ポリシーの設定や、他の環境への展開が考えられます。