目次
はじめに
こんにちは、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プロバイダーを作成します。
必要事項の選択と入力を行う必要があります。
それぞれ以下に記載している内容を記載してください。
- プロバイダのタイプ:「OpenID Connect」を選択
- プロバイダのURL:「https://token.actions.githubusercontent.com」 を入力
-
対象者:「sts.amazonaws.com」を入力
※タグは、任意でお好きに設定してください。
以下は、参考画像です。
IDプロバイダーが作成できたら以下のようになります。
IAMロールを作成する
IAMロールを作成します。
必要事項の選択と入力を行う必要があります。
それぞれ以下に記載している内容を記載してください。
- 「信頼されたエンティティを選択」画面での対応
- 信頼されたエンティティタイプ:「カスタム信頼ポリシー」を選択
-
カスタム信頼ポリシー:以下の内容を入力
{ "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上で管理されているリポジトリ名に置き換えてください。(ご自身の管理するリポジトリ全てで利用を想定されている場合は、ワイルドカード [*] を設定することもできます)
以下は、参考画像です。
- 「許可を追加」画面での対応
-
許可ポリシー:AWSリソースに許可したい権限を選択してください。
※可能な限り最小権限を原則としてポリシーを選択してください。
以下は、参考画像です。
- 「名前、確認、および作成」画面での対応
-
ロール名:任意で好きな名前でロール名を入力してください。
※ロール名は、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
まとめ
IDプロバイダーとIAMロールを利用することで、GitHub Actionsに対して一時的なAWSの認証情報を連携することができるので、IAMアクセスキー、シークレットアクセスキーの管理から解放されました。
また、セキュリティの面からも長期的認証情報の作成は、あまり推奨されていないので可能な限り一時情報を使っていくようにしましょう。

プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ