背景
これまで、デプロイに使う秘密情報を GitHub Secrets で管理していました。
デプロイは GitHub Actions で実行しており、GitHub Secrets から値を取得して env ファイルを書き換える構成です。
しかし、同じような内容を AWS Systems Manager のパラメータストアでも管理することがあり、管理箇所が二つあると値の更新漏れが起きやすくなります。
そこで、パラメータストアに一本化することにしました。
一本化すると、GitHub Actions がパラメータストアから値を取得する必要が生じます。
取得には AWS の認証情報が必要ですが、アクセスキーを GitHub Secrets に置いたのでは一本化の意味がありません。
そこで OIDC(OpenID Connect)による一時認証を使います。
GitHub Actions が発行する ID トークンを AWS 側で検証し、短命の認証情報を払い出す仕組みで、長期のアクセスキーを保管せずに済みます。
新旧のフローを比べると次のようになります。
変わるのは秘密情報の取得元だけで、前後の流れ(ワークフロー実行、env ファイルの生成、デプロイ)は変わりません。
作業は次の二段階に分かれます。
- AWS 側:OIDC プロバイダの作成、パラメータ取得用 IAM ポリシーとロールの作成
- GitHub Actions 側:ロールの引き受け、AWS CLI でのパラメータ取得
OIDC プロバイダの作成
GitHub のドキュメントに従い、AWS コンソールから ID プロバイダを作成します。
参考:GitHub Docs「AWS での OpenID Connect の構成」
IAM ポリシーとロールの作成
パラメータの読み取りに必要なアクションは三つあります。
- ssm:GetParameter:単一のパラメータを取得する
- ssm:GetParameters:複数のパラメータを一度に指定して取得する
-
ssm:GetParametersByPath:
/prod/app/のようなパスを指定し、その配下のパラメータを一括取得する
Resource は * でも動作しますが、対象のパラメータやパスに絞ったほうが安全です。
このポリシーを GithubActions-SSM-ReadOnly-TestApp として作成しました。
続けて、作成した OIDC プロバイダを信頼先とする IAM ロールを作成し、このポリシーをアタッチします。
GitHub Actions からの取得テスト
動作確認用に、パラメータを二つ用意しました。
- /testString:平文(String)
- /testSecure:AWS マネージド型 KMS キーで暗号化した SecureString
暗号化されたパラメータを復号して取得するには、get-parameter に --with-decryption を付けます。
なお、カスタマー管理型 KMS キーで暗号化している場合は、IAM ポリシーに kms:Decrypt の許可も必要になります。
ワークフローは次のとおりです。
aws-actions/configure-aws-credentials にロールの ARN を渡すと、OIDC で認証して一時認証情報を設定してくれます。
name: AWS OIDC Test
on:
workflow_dispatch:
permissions:
id-token: write
contents: read
jobs:
aws-oidc:
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::xxxxxxxxxxxx:role/作成したロール名
aws-region: ap-northeast-1
- name: Verify AWS Credentials
run: |
echo "=== OIDC認証の検証 ==="
aws sts get-caller-identity
echo "=== 認証成功 ==="
- name: Test SSM GetParameter
run: |
echo "=== SSMパラメータ取得テスト(平文) ==="
aws ssm get-parameter --name "/testString" --region ap-northeast-1
echo "=== SSMパラメータ取得テスト(暗号化) ==="
aws ssm get-parameter --name "/testSecure" --with-decryption --region ap-northeast-1
echo "=== SSMパラメータ取得成功 ==="
permissions の id-token: write は、GitHub Actions が ID トークンを発行するために必要な指定です。
これがないと OIDC 認証のステップが失敗します。
結果
ワークフローを手動実行し、sts get-caller-identity で引き受けたロールを確認したうえで、平文と暗号化の両方のパラメータを取得できました。
終わり
これでアクセスキーを持たずに、GitHub Actions からパラメータストアの値を取得できました。
意外とすぐ終わる作業なので、GitHub Secrets と AWS Systems Manager で重複管理している場合はお試しください!


