Azure経験者がAWS ECSで同じ構成を作ってみる⑤ ~GitHub ActionsのSecretsをOIDC認証へ置き換える~

AWS

今回はAWS ECSサービスに関する記事です。

前回までは、GitHub SecretsへAWSアクセスキーを登録し、GitHub ActionsからAmazon ECRへコンテナイメージをPushする構成を作成しました。

この構成でも問題なく動作しますが、長期アクセスキーをGitHubへ保管する運用となるため、実運用ではあまり推奨されません。

本記事ではシリーズ第5弾として、GitHub Secretsによるアクセスキー認証をAWS純正のOIDC認証へ移行し、一時認証でECRへPushできる構成へ改善していきます。

前回記事はこちら⇩

Azure経験者がAWS ECSで同じ構成を作ってみる④ ~ECS ExpressMode展開~
今回はAWS ECSサービスに関する記事です。Azure のコンテナサービス(App Service)をAWSへ移植するために必要な構成を解説していきます。本記事はシリーズ構成の第四弾として、ECS ExpressModeの構築と、接続周り…

Azure経験者がAWS ECSで同じ構成を作ってみる⑤ ~GitHub ActionsのSecretsをOIDC認証へ置き換える~

実装内容

前回記事では、ECS ExpressMode(10-12を削除し14実施) を解説しました。

  1. Route53
  2. IAMロール
  3. DynamoDB
  4. ECR
  5. S3
  6. IAMユーザー
  7. GitHub
  8. SEG
  9. ECSクラスター
  10. ECSタスク定義
  11. ECS Service
  12. ALB
  13. DynamoDB項目追加
  14. ExpressModeで構築
  15. IAMプロパイダー
  16. IAMロール(OIDC用)
  17. GitHub修正

今回はIAMユーザーの代替としてIAMプロパイダーおよびOIDC用のIAMロール(15-17)
を設定し、動作確認まで実施します。
本記事は前回第二弾の読者の方を対象とし、1-5まで構築済の前提で進めていきます。

第二弾のIAMユーザを差し替えるだけのため、今回用のイメージ図はありません。

各種構築

IAMプロパイダー

まずはIAMユーザーのCredencialsの代替となるIAMプロパイダーを作成していきます。

■プロパイダー設定値
  • プロパイダのタイプ:OpenID Connect
  • プロパイダのURL:https://token.actions.githubusercontent.com
  • 対象者:sts.amazonaws.com
(1)IAMプロパイダを開く
(2)パラメータを設定
(3)IAMプロパイダ作成完了確認

IAMロール(OIDC用)

先程作成したIAMプロパイダをセットしたIAMロールを作成します。

■IAMロールの設定値

とりあえず仮の値をセットします。信頼ポリシーは作成後に編集必要です。

  • 信頼されたエンティティタイプ:ウェブアイデンティティ
  • アイデンティティプロバイダー:token.actions.githubusercontent.com
  • Audience:sts.amazonaws.com
  • GitHub organization:<GitHubのOrganization名またはユーザー名>
  • GitHub repository:<リポジトリ名>
  • GitHub branch:空欄
  • 許可ポリシー:AmazonEC2ContainerRegistryPowerUser
  • IAMロール名:GitHub-OIDC-ECR-Push
(1)IAMプロバイダの情報をセット

作成したIAMプロパイダと自身のGitHub情報を記述していきます。

※画像は例として筆者のプライベートリポジトリを記述しています

(2)許可ポリシーの追加

検索窓から絞り込んでチェックを入れます。

(3)IAMロール名の設定

この画面で信頼ポリシーはどうやっても編集できませんので、不満ですがこのまま進めます。
※編集を押すと最初の画面に戻されます

(4)IAMロール作成完了

作成したロールを開きます。

(5)信頼ポリシーの編集

信頼関係タブから信頼ポリシ-の編集 を押下します。

(6)信頼ポリシー編集後

※コレを実施しないとGitHub Actions実施時に認証が通らずコケます

StringLike以下の設定値を、以下のように修正します。

“repo:<GitHubのOrganization名またはユーザー名>@*/<GitHubのリポジトリ名>@*:*”

今回は以下のようにワイルドカードを使用して認証しています。

“StringLike”: {
“token.actions.githubusercontent.com:sub”: “repo:addache@/sandbox@:*”
}

これにより、GitHubのOrganization IDやRepository IDを意識せずに動作確認できます。

※検証用の設定です。

最後に、ARNをコピーしておきます(このあとすぐ使う)

GitHub修正

今回はWorkflowのYamlテンプレート修正および、
変数としてVariablesを利用します。

OIDC情報は特に秘匿すべきものではありませんので、Secretsへ設定するのは少々過剰。
ただ記事として提供するにあたり、一意の値を含むパラメータは変数などの形で
外出ししたほうが提供しやすいです。

そのためSecretsではなくVariablesを利用します。

Variablesには公開しても問題ない設定値を格納します。

■GitHubの設定値
  • Name:AWS_ROLE_ARN
  • Value:<コピーしたIAMロールのARN>
(1)Variablesの設定画面を開く
(2)Name:Valueをセット
(3)Variables設定完了

Variablesは[vars.<Name>]で呼び出すことができます。

(5)Workflowを上書き

以下のコードへ差し替えます。
※無効化している行は最終的に削除して問題ありません

name: Build and Push Docker Image

on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

env:
  AWS_REGION: ap-northeast-1
  ECR_REPOSITORY: ecs-sample-api

permissions:
  id-token: write
  contents: read
  
jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source code
        uses: actions/checkout@v4

      # OIDC版
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v5
        with:
          role-to-assume: ${{ vars.AWS_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}

       # アクセスキー版(切り戻し用)
#      - name: Configure AWS credentials
#        uses: aws-actions/configure-aws-credentials@v5
#        with:
#          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
#          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
#          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Set image tag
        id: image-tag
        shell: bash
        run: |
          if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
            echo "value=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
          else
            echo "value=manual-${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
          fi

      - name: Build and push Docker image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ steps.image-tag.outputs.value }}
        run: |
          IMAGE_URI="$ECR_REGISTRY/$ECR_REPOSITORY"

          docker build \
            -t "$IMAGE_URI:$IMAGE_TAG" \
            -t "$IMAGE_URI:latest" \
            .

          docker push "$IMAGE_URI:$IMAGE_TAG"
          docker push "$IMAGE_URI:latest"

なお、操作がわからない方は第二弾でWorkflowを作成しているのでそちらを参照してください。

Azure経験者がAWS ECSで同じ構成を作ってみる② ~Image Push~
今回はAWS ECSサービスに関する記事です。Azure のコンテナサービス(App Service)をAWSへ移植するために必要な構成を解説していきます。本記事はシリーズ構成の第二弾として、ECS Fargateの設定準備に向けコンテナイ…
(6)ECR:Push前の状態を表示

ECRを開いてイメージPush前の状態を確認します。

(7)GitHub ActionsからPushして、ECRを確認

新しいイメージのPush成功しました。

これでOIDC化は完了です。

利用しなくなったSecretsは削除しておきましょう。

OIDC認証でハマったポイント

GitHub OIDCでは、実際に送信されるSubject(sub)をIAMロールのTrust Policyと一致させる必要があります。

今回検証したところ、

repo:addache/sandbox:...

では認証されず、

CloudTrailを見ると実際には

repo:addache@222222222/sandbox@3333333333:ref:refs/tags/v1.1.2

という形式で送信されていました。
※各IDは一応伏せてます

そのため本記事では

repo:addache@*/sandbox@*:*

というワイルドカード指定で認証しています。

本番環境ではOrganization ID・Repository IDを固定して利用することをおすすめします。

最後に

実運用ではIDを固定する

本番環境では、ワイルドカードではなくOrganization ID・Repository IDを固定することを推奨します。

repo:addache@222222222/sandbox@3333333333:*

GitHubのIDはGitHub APIから取得できます。
固有名は差し替えてご利用ください。

gh api users/addache --jq '.id'
gh api repos/addache/sandbox --jq '.id'

またはREST APIでも取得できます(公開リポジトリの場合)。

https://api.github.com/users/addache

https://api.github.com/repos/addache/sandbox

補足

2026年8月時点では、
GitHub OIDCのSubject ClaimにOrganization ID・Repository IDが含まれる形式となっていました。

従来の記事のように repo:owner/repository:* のみでは認証に失敗する場合があるため、CloudTrailで実際の principalId を確認しながら設定を調整しました。

※AWSが自動生成する信頼ポリシーもこの形になっているので注意が必要です

関連記事のご紹介

シリーズ初回記事、各種準備と設計のご紹介

Azure経験者がAWS ECSで同じ構成を作ってみる① ~基盤準備編~
今回はAWS ECSサービスに関する記事です。Azure のコンテナサービス(App Service)をAWSへ移植するために必要な構成を解説していきます。本記事はシリーズ構成の第一弾として、設計やIAM準備の部分を解説します。Azure経…

シリーズ2回目記事、主にGitHubの設定方法解説

Azure経験者がAWS ECSで同じ構成を作ってみる② ~Image Push~
今回はAWS ECSサービスに関する記事です。Azure のコンテナサービス(App Service)をAWSへ移植するために必要な構成を解説していきます。本記事はシリーズ構成の第二弾として、ECS Fargateの設定準備に向けコンテナイ…

シリーズ3回目記事、ECSデプロイして動作検証まで実施

Azure経験者がAWS ECSで同じ構成を作ってみる③ ~ECS Fargate構築~
今回はAWS ECSサービスに関する記事です。Azure のコンテナサービス(App Service)をAWSへ移植するために必要な構成を解説していきます。本記事はシリーズ構成の第三弾として、いよいよECS Fargateの構築と、接続周り…

シリーズ4回目記事、ECS ExpressModeでデプロイして動作検証まで実施

Azure経験者がAWS ECSで同じ構成を作ってみる④ ~ECS ExpressMode展開~
今回はAWS ECSサービスに関する記事です。Azure のコンテナサービス(App Service)をAWSへ移植するために必要な構成を解説していきます。本記事はシリーズ構成の第四弾として、ECS ExpressModeの構築と、接続周り…

コメント

タイトルとURLをコピーしました