はじめに
GitHub Actions を使って terraform による AWS 環境構築を行いました。
その際に OIDC 認証を行ったのでその部分についてまとめておきたいと思います。
環境
今回は以下が準備されている想定で行います。
- AWS アカウント
- GitHub リポジトリ
設定
設定は以下の流れで行います。
AWS (ID プロバイダ設定
→ IAM ロールの作成
) → GitHub (Secrets の登録
→ Workflow の作成
)
OIDC 認証の作成 (AWS)
AWS マネジメントコンソールにログインします。
ID プロバイダ
「IAM > ID プロバイダ」 から [プロバイダを追加] をクリックします。
ID プロバイダの設定
[プロバイダを追加] をクリックします。
プロバイダのタイプ:OpenID Connect
プロバイダのURL:https://token.actions.githubusercontent.com
対象者:sts.amazonaws.com
以上で ID プロバイダの追加は完了です。
IAM ロールの作成 (AWS)
「IAM > ロール」 から [ロールを作成] をクリックします。
信頼されたエンティティを選択
信頼されたエンティティタイプの ウェブアイデンティティ を選択。
ウェブアイデンティティ
以下を入力し [次へ] をクリックします。
アイデンティティプロバイダー:token.actions.githubusercontent.com
Audience:sts.amazonaws.com
GitHub 組織:[GitHub Actions を利用するリポジトリが所属する Orgainzation の名前]
GitHub リポジトリ:[GitHub Actions を利用するリポジトリ名] ※オプション
GitHub ブランチ:[GitHub Actions を利用するリポジトリのブランチ] ※オプション
今回はオプションの2つも指定しています。
指定することで IAM ロールへのアクセス範囲をリポジトリ、ブランチ単位まで限定することができるため、よりセキュアになります。
状況に応じて調整して下さい。
上記画像では ga-test
というリポジトリの main
ブランチからのアクセス(アクション)を許可する設定となります。
許可を追加
許可ポリシー を追加します。
今回は AWS との連携が確認できれば良いため ReadOnlyAccess を付与しています。
実際に導入する際は利用する AWS サービスに応じてアクセス権限を調整してください。
追加したら [次へ] をクリックします。
名前、確認、および作成
ロールの詳細 で ロール名 を入力します。ここでは仮に GitHubActions
としておきます。
あとはそのままで [ロールを作成] をクリックします。
また、ステップ2 の内容は ウェブアイデンティティ で指定した内容を JSON 形式で表しています。
赤ラインの部分が先ほど入力した内容を反映した部分です。
ロールの確認
作成が完了すると以下のようにロールが確認できます。
GitHubActions (GitHub)
GitHubにログインし対象のリポジトリを選択します。
Secrets の登録
Settings
タブから Secrets and variables > Actions
をクリックし、表示された画面で Secrets
タブの [New repository secret]
をクリックします。
Name に AWS_ROLE_ARN
を入力し、Secret に AWS で作成した IAM ロール ARN
を入力します。
以下のように Secrets タブに登録されていればOKです。
Workflowの設定
Actions タブをクリックし Simple workflow の [Configure]
をクリックします。
編集画面になるので以下の内容をコピペして [Commit changes...] をクリックします
name: AWS OIDC
on:
push:
branches:
- 'main'
permissions:
id-token: write
contents: read
jobs:
aws-oidc:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set environment variables based on branch
id: set-vars
run: echo "ASSUME_ROLE=${{ secrets.AWS_ROLE_ARN }}" >> $GITHUB_ENV
- name: Debug Variables
run: echo "ASSUME_ROLE=${{ env.ASSUME_ROLE }}"
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-1
role-to-assume: ${{ env.ASSUME_ROLE }}
- name: Print Hello World plan
run: echo "Hello, Plan"
ポップアップが表示されるので [Commit changes] をクリックします。
すると Workflow が実行されるため [Create blank.yml] をクリックします。
[aws-oidc] というのをクリックします。
Configure AWS Credentials という部分をクリックすると実行ログが確認できます。
AWS 側で作成した GiHubActions のロールが assumedRoleId として確認できます。
次に以下の部分を修正します。
- name: Print Hello World plan
run: echo "Hello, Plan"
- name: AWS CLI
run: aws s3 ls
先ほどは AWS 認証が完了した後に Hello, Plan
と表示させるだけの内容でしたが、今度は Amazon S3 のバケット一覧を取得するためのコマンドになります。
先ほどの手順を参考に改めて実行ログを確認します。
今度は AWS CLI という履歴があるためそこをクリックしログを確認します。
S3 バケット一覧が出力され、先ほど OIDC 認証した権限で AWS 環境へアクセスできていることが確認できます。
おわりに
今回は AWS への OIDC 認証にスポットを当てた内容でしたが、terraform の利用や yml の説明といった GitHub Actions を活用した内容について書いtければと思います。
参考