GitHub ActionsからAWSリソースにアクセスする際、従来のIAMユーザーのアクセスキー・シークレットキーの代わりに、OIDC(OpenID Connect)を使用した一時的な認証を行う設定手順です。
これにより以下の利点があります:
- セキュリティ向上: 長期間有効なクレデンシャルを保存する必要がない
- 自動ローテーション: トークンは短期間で自動的に無効化される
- 最小権限原則: 特定のリポジトリ・ブランチからのみアクセス可能
- IAM サービスに移動
- 左メニュー「Identity providers」をクリック
- 「Add provider」ボタンをクリック
- Provider type: 「OpenID Connect」を選択
- Provider URL:
https://token.actions.githubusercontent.comを入力 - Audience:
sts.amazonaws.comを入力 - 「Get thumbprint」をクリックして証明書のサムプリントを取得
- 「Add provider」をクリック
- IAM → Roles → 「Create role」
- Trusted entity type: 「Web identity」を選択
- Identity provider: 先ほど作成したGitHub OIDCプロバイダーを選択
- Audience:
sts.amazonaws.comを選択
「Next」をクリック後、信頼関係を以下のように設定:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<AWSアカウント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:smalruby/smalruby-infra:*"
}
}
}
]
}重要: <AWSアカウントID> は実際のAWSアカウントIDに置き換えてください。
デプロイに必要な権限を持つポリシーを添付します:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:CreateFunction",
"lambda:UpdateFunctionCode",
"lambda:UpdateFunctionConfiguration",
"lambda:DeleteFunction",
"lambda:GetFunction",
"lambda:ListFunctions",
"lambda:AddPermission",
"lambda:RemovePermission"
],
"Resource": "*"
}
]
}{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:*"
],
"Resource": "*"
}
]
}{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:CreateStack",
"cloudformation:UpdateStack",
"cloudformation:DeleteStack",
"cloudformation:DescribeStacks",
"cloudformation:DescribeStackEvents",
"cloudformation:DescribeStackResources",
"cloudformation:GetTemplate",
"cloudformation:ValidateTemplate",
"cloudformation:CreateChangeSet",
"cloudformation:DescribeChangeSet",
"cloudformation:ExecuteChangeSet",
"cloudformation:DeleteChangeSet"
],
"Resource": "*"
}
]
}{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:DeleteBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:GetBucketVersioning",
"s3:PutBucketVersioning"
],
"Resource": [
"arn:aws:s3:::aws-sam-cli-managed-default-samclisourcebucket-*",
"arn:aws:s3:::aws-sam-cli-managed-default-samclisourcebucket-*/*"
]
},
{
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:DeleteRole",
"iam:GetRole",
"iam:PassRole",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:CreatePolicy",
"iam:DeletePolicy",
"iam:GetPolicy"
],
"Resource": "*"
}
]
}- Role name:
GitHubActions-smalruby-infra-deploy(推奨) - Description:
Role for GitHub Actions to deploy smalruby infrastructure
「Create role」をクリックしてロールを作成します。
- GitHubリポジトリ「smalruby/smalruby-infra」に移動
- Settings → Secrets and variables → Actions
- 「New repository secret」をクリック
以下のSecretを追加:
| Secret名 | 値 | 説明 |
|---|---|---|
AWS_ROLE_ARN |
arn:aws:iam::<AWSアカウントID>:role/GitHubActions-smalruby-infra-deploy |
作成したIAMロールのARN |
注意: <AWSアカウントID> は実際のAWSアカウントIDに置き換えてください。
OIDCが正常に動作することを確認後、以下の従来のSecretsは削除できます:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
mainブランチにpushしてGitHub Actionsが正常に実行されることを確認します。
GitHub Actions実行ログで以下を確認:
- OIDC認証が成功している
- AWS CLIコマンドが正常に実行されている
- デプロイが完了している
✅ セキュリティ向上: 長期クレデンシャルの漏洩リスクなし ✅ 自動管理: トークンの自動ローテーション ✅ アクセス制御: 特定リポジトリ・ブランチからのみアクセス可能 ✅ 監査: CloudTrailでアクセスログが記録される
原因: 信頼関係の設定が正しくない 主な問題:
- Actionが
sts:AssumeRoleになっている(正:sts:AssumeRoleWithWebIdentity) - 条件が厳しすぎる(推奨:
repo:smalruby/smalruby-infra:*) - リポジトリ名・ブランチ名の誤り
対処法:
- IAMロールの信頼関係を確認
"Action": "sts:AssumeRoleWithWebIdentity"になっているか確認- 条件が
"repo:smalruby/smalruby-infra:*"になっているか確認
修正方法: AWSマネジメントコンソールのIAM → Roles → GitHubActions-smalruby-infra-deploy → Trust relationships タブで信頼関係を編集してください。
原因: ロールに必要な権限がない 対処: ロールに適切なポリシーが添付されているか確認
原因: GitHub Actionsの設定が正しくない
対処: permissionsセクションにid-token: writeがあるか確認
原因: OIDC Identity Providerが作成されていない 対処: 手順1.2に従ってOIDC Providerを作成
- OIDC Provider確認: AWSマネジメントコンソール → IAM → Identity providers で確認
- ロール存在確認: AWSマネジメントコンソール → IAM → Roles で「GitHubActions-smalruby-infra-deploy」を検索
- 信頼関係確認: 該当ロールの Trust relationships タブで設定内容を確認
- 権限確認: 該当ロールの Permissions タブで必要なポリシーが添付されているか確認