👾

GitHub Actions で Parameter Store からデータを取得して EC2 の .env に設定する方法

2025/02/07に公開

はじめに

今回は業務で必要になった小ネタを紹介します。
GitHub Actions を活用して、AWS Systems Manager Parameter Store からデータを取得し、EC2 インスタンス上の.envファイルに値を設定してみます。
.env ファイルはサーバ上のスクリプトから利用される感じです。

前提条件

  • AWSアカウント:適切な権限を持つAWSアカウントが必要です。
  • GitHubリポジトリ:コードが配置されているリポジトリ。
  • EC2インスタンス:ターゲットとなるEC2インスタンスが稼働していること。

手順

1. Parameter Storeにパラメータを登録

まず、AWS Systems Manager の Parameter Store に、EC2 インスタンスで使用する環境変数を登録します。下のコマンドで、sample-environment-value という名前のパラメータを登録します。

aws ssm put-parameter --name "sample-environment-value" --type "SecureString" --value "your_value"

your_valueには、実際の環境変数の値を入力してください。

2. IAMロールの設定

GitHub ActionsからAWSリソースにアクセスするためのIAMロールを作成します。
下のポリシーと信頼関係を設定してください。

カスタムインラインポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ssm:GetParameter",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:ap-northeast-1:アカウントID:parameter/sample-environment-value"
            ]
        },
        {
            "Action": [
                "ssm:SendCommand"
            ],
            "Resource": [
                "arn:aws:ssm:ap-northeast-1:*:document/AWS-RunShellScript",
                "arn:aws:ec2:ap-northeast-1:アカウントID:instance/*"
            ],
            "Effect": "Allow"
        }
    ]
}

信頼ポリシー

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::アカウントID:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:リポジトリ名:*"
                }
            }
        }
    ]
}

この設定により、GitHub ActionsからAWSリソースへのアクセスが許可されます。

3. GitHub Actionsのワークフロー設定

次に、GitHubリポジトリ内に以下のdeploy.ymlファイルを作成します。

name: Deploy to EC2

on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE }}
          aws-region: ap-northeast-1

      - name: Execute SSM Run Command
        run: |
          aws ssm send-command \
            --instance-ids ${{ secrets.EC2_INSTANCE_ID }} \
            --document-name "AWS-RunShellScript" \
            --parameters commands='[
          "cat <<EOF > /home/ssm-user/.env
          ENV_VALUE=$(aws ssm get-parameter --name \"sample-environment-value\" --with-decryption --query \"Parameter.Value\" --output text)
          EOF"
          ]' \
            --comment "Create .env file" \
            --timeout-seconds 600

ポイント

  • actions/checkout@v4:リポジトリのコードをチェックアウトします。
  • aws-actions/configure-aws-credentials@v4:AWS認証情報を設定します。
  • aws ssm send-command:SSMを使用して、EC2インスタンス上でシェルスクリプトを実行します。
  • aws ssm get-parameter: Parameter Store から値を取得しています。
    このワークフローにより、Parameter Storeから取得した値を.envファイルに書き込みます。

4. GitHub Secretsの設定

GitHubリポジトリのSettingsから、以下のSecretsを設定します。

  • AWS_ROLE:作成したIAMロールのARN。
  • EC2_INSTANCE_ID:ターゲットとなるEC2インスタンスのID。
    これにより、ワークフロー内でこれらの値を安全に参照できます。

5. 実際に動かしてみる

こんな感じで実行できます。

EC2 側の結果

[ssm-user@ip-xx-xx-xx-xx ~]$ pwd
/home/ssm-user
[ssm-user@ip-xx-xx-xx-xx ~]$ cat .env
ENV_VALUE=your_value

さいごに

今回は IAM ロールなどの設定は問題無くできたのですが、.env を書き出すところでちょっとつまずきました。最終的にシンプルな感じになりましたが、試行錯誤して時間がかかってしまいました😵‍💫
GitHub Actions は普段そこまで触らないのですがやはり便利なのでもっと自在に操れるようにしたいなーと思いました😁

レスキューナウテックブログ

Discussion