AWS IAM

GitHub Actions実行時にIAMロールを使うように設定してみた

はじめに

こんにちは、CodeCommit廃止によってGitHubを使いまくっている、ディーネットの山田です。

GitHubに限りませんが、GitHub Actionsを用いることでデプロイ作業が楽になりました。

また、AWS SAM(AWS Serverless Application Model)のようなフレームワークとの相性もよいので、個人的に制作したサーバレスアプリケーションの開発・デプロイが本当に楽になりました。

しかし、GitHub Actionsは、AWSのサービスではないのでAWS環境にリソースを構築する際、何らかの形でAWSへのアクセス権限を得る必要があります。

IAMアクセスキー、シークレットアクセスキーでもよいですが、キーのローテーション問題やキーの流出時の対応といった運用上の課題があります。

この課題を解消させるには、GitHubのOIDCとフェデレーションすることで、対応できます。

アマゾン ウェブ サービスでの OpenID Connect の構成

(そこまで言うなら、CodeBuild、CodePipelineと連携させたらいいやん!ってなるかもしれないですが、GitHubだけで完結させたかったのです)

早速試してみた

IAMにあるIDプロバイダーを作成する

IDプロバイダーを作成します。

必要事項の選択と入力を行う必要があります。

それぞれ以下に記載している内容を記載してください。

以下は、参考画像です。

IDプロバイダーが作成できたら以下のようになります。

IAMロールを作成する

IAMロールを作成します。

必要事項の選択と入力を行う必要があります。

それぞれ以下に記載している内容を記載してください。

  1. 「信頼されたエンティティを選択」画面での対応
  • 信頼されたエンティティタイプ:「カスタム信頼ポリシー」を選択
  • カスタム信頼ポリシー:以下の内容を入力

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "arn:aws:iam::{AWSアカウントID}:oidc-provider/token.actions.githubusercontent.com"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringLike": {
                        "token.actions.githubusercontent.com:sub": "repo:{GitHubの組織名やユーザー名}/{GitHubのリポジトリ名}:*"
                    },
                    "StringEquals": {
                        "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                    }
                }
            }
        ]
    }
    • AWSアカウントID:ご自身のAWSアカウントIDに置き換えてください。
    • GitHubの組織名やユーザー名:GitHub上でご自身の所属する組織名やユーザー名に置き換えてください。(ここにワイルドカード [*] を設定するのはリスクがあるのでやめてください)
    • GitHubのリポジトリ名:GitHub上で管理されているリポジトリ名に置き換えてください。(ご自身の管理するリポジトリ全てで利用を想定されている場合は、ワイルドカード [*] を設定することもできます)

以下は、参考画像です。

  1. 「許可を追加」画面での対応
  • 許可ポリシー:AWSリソースに許可したい権限を選択してください。

    ※可能な限り最小権限を原則としてポリシーを選択してください。

以下は、参考画像です。

  1. 「名前、確認、および作成」画面での対応
  • ロール名:任意で好きな名前でロール名を入力してください。

    ※ロール名は、GitHub Actionsの設定ファイルで利用します。

  • 説明:任意で好きな説明を入力してください。

    ※後で何のためのロールだったのかわかるような記載内容を推奨します。

以下は、参考画像です。

※参考画像では、SAMデプロイで使用したものなので、FullAccessをいっぱい付けております。。。

ここで設定は完了です。

IAMロールのARNは、GitHubのWorkflowsで利用するため、控えておきましょう。

(arn:aws:iam::{AWSアカウントID}:role/{IAMロール名})

GitHub ActionsのWorkflowsで利用するサンプル設定

サンプル設定

Workflowsでは、以下のような設定を使って実際にSAMのデプロイに活用しております。

name: Deploy SAM Application

on:
  push:
    branches:
      - main  # メインブランチにプッシュされたときに実行

permissions:
  id-token: write   # Required for requesting the JWT
  contents: read    # Required for actions/checkout

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-python@v3
        with:
          python-version: '3.13'

      - uses: aws-actions/setup-sam@v2

      - uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: {IAMロールのARN} # IAMロールのARNを記載
          aws-region: ap-northeast-1 # AWSリージョンを記載(Actions secrets and variablesからの変数を推奨)
          role-session-name: GitHubActions-${{ github.repository_owner }}-${{ github.ref_name }}

      - name: SAM Build
        run: sam build --use-container --debug

      - name: SAM Deploy
        run: |
          # samのデプロイコマンドを列挙(具体的な内容は割愛)

参考サイト

具体的な文法については、以下の文献をご覧ください。

Configuring OpenID Connect in Amazon Web Services

GitHub Actionsのワークフロー構文

まとめ

IDプロバイダーとIAMロールを利用することで、GitHub Actionsに対して一時的なAWSの認証情報を連携することができるので、IAMアクセスキー、シークレットアクセスキーの管理から解放されました。

また、セキュリティの面からも長期的認証情報の作成は、あまり推奨されていないので可能な限り一時情報を使っていくようにしましょう。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA