AWSのIAM(Identity and Access Management)は、クラウドリソースへのアクセスを細かく制御できる便利な仕組みです。特に「ユーザー」と「ロール」は名前が似ているため、初心者は混同しがちです。この記事では、ユーザーとロールの違いを整理し、GitHub Actions から安全にリソースへアクセスするまでの流れを解説します。
1. IAMユーザーとは?
- 実在する人物やサービスアカウントに対して作成する認証情報(アクセスキー・シークレットキー)を保持します。
- 長期的に使用することが前提で、パスワードやMFAでの認証も可能です。
- 例: 社内の開発者が直接 AWS コンソールにログインするときに使う。
2. IAMロールとは?
- 「誰が」ではなく「何が」行うかを定義した一時的な権限セットです。
- ロール自体には認証情報がありません。代わりに AssumeRole という API 呼び出しで一時的な認証情報を取得します。
- 主に CI/CD パイプラインや外部サービス が一時的に権限を借りるシーンで利用されます。
3. ユーザーとロールを混同しないための整理ポイント
| 項目 | IAMユーザー | IAMロール |
|---|---|---|
| 所有者 | 人やサービスアカウント | AWS リソースや外部サービス |
| 認証情報 | 永続的(アクセスキー) | 一時的(STS トークン) |
| 用途 | 手動操作・長期利用 | 自動化・一時利用 |
| MFA | 必須にできる | 必須にできない(AssumeRole 時に MFA を要求可) |
4. GitHub Actions でロールを安全に利用する手順
-
ロール作成
必要な権限(例: S3 バケットへの PutObject)だけを許可したロールを作ります。信頼ポリシーで GitHub の OIDC プロバイダーを許可します。 -
GitHub リポジトリに OIDC 設定
リポジトリの Settings → Security → Actions → OIDC でaudiencesをsts.amazonaws.comに設定。 -
Workflow で AssumeRole
aws-actions/configure-aws-credentialsアクションを使い、ロールを一時的に取得します。
name: Deploy to S3
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write # OIDC 用に必要
steps:
- uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsDeploy
aws-region: ap-northeast-1
- name: Sync static files
run: aws s3 sync ./public s3://my-bucket --delete
上記のように ロールを直接参照 すれば、アクセスキーをリポジトリに保存する必要がなくなり、漏洩リスクが大幅に低減します。
5. まとめ
- ユーザーは長期的に使う人・サービス向け、ロールは一時的に権限を貸し出す仕組みとして使い分ける。
- CI/CD ではロール+GitHub OIDC を組み合わせると、認証情報をコードに埋め込まずに安全にデプロイが可能です。
- 最初は権限を最小化し、必要に応じてポリシーを拡張していくと、セキュリティリスクを抑えられます。