はじめに
こんにちは。ニフティ株式会社の仲上です。
CI/CDを構築する際、アクセスキーの管理が大変です。
アクセスキーやシークレットキーをGitHub secretsなどに格納する方法がありますが、管理が大変で、期限切れの対応などが必要になります。
そこで、本記事ではOIDCを利用した認証でAWSへのアクセス権限を管理する方法をご紹介したいと思います。
OIDCについて
OIDCはOpenID Connectの略です。
OIDCはSSO(シングルサインオン)の実装手法の1つで、多くのサービスに利用されている認証フォーマットです。
他の認証フォーマットとしては、SAMLが有名です。
OpenID Connect の言葉の説明は以下の記事がわかりやすいです。
仕組みの解説については、以下の記事が有名です。
AWSではこの認証方式を利用した権限管理機能が備わっています。
メリット
メリットとしては以下の点が挙げられます。
- 鍵の管理が不要
- ユーザーに依存しない認証方法になる
- トークンの期限に頭を抱えなくて済む
デメリット
デメリットとしては以下の点が挙げられます。
- 他のリポジトリからデプロイするようになった場合、再度認証が必要
- 設定をミスするとすべてのGitHub上のリポジトリからアクセスできてしまう
特に、AWSのIAMロールへのアクセス権限管理には細心の注意を払う必要があります。
今回はこの機能でリポジトリの認証設定を行い、デプロイしていくことにします。
設定手順
AWS の IAM へ GitHub のIDプロバイダを追加
デプロイ対象のIAMでIDプロバイダを選択します。

プロバイダを追加します。

以下の内容で設定します。
プロバイダのタイプ | OpenID Connect |
---|---|
プロバイダの URL | https://token.actions.githubusercontent.com |
対象者 | sts.amazonaws.com |

IAMロールの作成
IAMロールから、カスタム信頼ポリシーを選択します。

カスタム信頼ポリシーの内容は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "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", "token.actions.githubusercontent.com:sub": "repo:{デプロイ対象のリポジトリ}:ref:refs/heads/*" } } } ] } |
「許可」ではデプロイに使用する権限を選択します。ここでは以下の権限を付与します。
- AWSCloudFormationFullAccess
- AmazonS3FullAccess
- AWSLambda_FullAccess
- CloudWatchLogsFullAccess
- IAMFullAccess
- AmazonDynamoDBFullAccess
- AmazonEC2FullAccess
権限はデプロイするテンプレートの内容によって変更してください。

ロール名と説明を追加して、「ロールを作成」を選択します。

ワークフローを作成する
ここでようやく GitHubのワークフローが登場します。
認証には以下のアクションを使用します。
こちらのアクションを使用することで、Role arnを指定するだけでAWS認証を行ってくれるようになります。
ワークフローを定義します。
GitHub Acrtions の画面から変数を登録します。

Repository variables を選択します。

AWS_OIDC_ROLE_ARNを設定します。先ほど作成したRoleのARNを書きます。

ワークフローを動かすため、デフォルトブランチをmain以外にしておきます。

以下のコードを作成してpushします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
name: 開発環境デプロイ run-name: Deploy ${{ github.ref_name }} to development by @${{ github.actor }} on: workflow_dispatch: push: branches-ignore: - main # allow use id-token permissions: id-token: write contents: read jobs: deploy: runs-on: ubuntu-latest timeout-minutes: 5 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v2 with: python-version: 3.12 - name: Setup SAM uses: aws-actions/setup-sam@v2 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: ${{ vars.AWS_OIDC_ROLE_ARN }} aws-region: ap-northeast-1 - name: sam validate run: sam validate - name: sam build run: sam build - name: sam deploy run: sam deploy |
動作確認
うまくいきました。みなさんもぜひOIDCを利用してみてください。
