0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

背景

これまで、デプロイに使う秘密情報を 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 プロバイダを作成します。

01_oidc_create.png

参考:GitHub Docs「AWS での OpenID Connect の構成」

IAM ポリシーとロールの作成

パラメータの読み取りに必要なアクションは三つあります。

  • ssm:GetParameter:単一のパラメータを取得する
  • ssm:GetParameters:複数のパラメータを一度に指定して取得する
  • ssm:GetParametersByPath/prod/app/ のようなパスを指定し、その配下のパラメータを一括取得する

Resource は * でも動作しますが、対象のパラメータやパスに絞ったほうが安全です。
このポリシーを GithubActions-SSM-ReadOnly-TestApp として作成しました。

03_iam_policy_create.png

続けて、作成した 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パラメータ取得成功 ==="

permissionsid-token: write は、GitHub Actions が ID トークンを発行するために必要な指定です。
これがないと OIDC 認証のステップが失敗します。

結果

ワークフローを手動実行し、sts get-caller-identity で引き受けたロールを確認したうえで、平文と暗号化の両方のパラメータを取得できました。

04_result.png

終わり

これでアクセスキーを持たずに、GitHub Actions からパラメータストアの値を取得できました。
意外とすぐ終わる作業なので、GitHub Secrets と AWS Systems Manager で重複管理している場合はお試しください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?