👾
GitHub Actions で Parameter Store からデータを取得して EC2 の .env に設定する方法
はじめに
今回は業務で必要になった小ネタを紹介します。
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