GitHub Actionsを使って本番環境へのデプロイを制限する方法
GitHub Actionsを使ったデプロイの自動化は便利ですが、本番環境へのデプロイは特定の信頼されたメンバーに制限する必要があります。本記事では、GitHubの特定のチームメンバーだけが本番環境へのデプロイを実行できるようにする方法を紹介します。具体的には、GitHub ActionsとAWS ECSを連携させてデプロイする際に、GitHubチームのメンバーかどうかを確認し、本番環境(prd
)に対してはチームメンバーのみがデプロイを許可される仕組みを実装します。
シチュエーション
-
チームの管理されたデプロイプロセス
デプロイの自動化を行いたいが、本番環境へのアクセスは制限したい。特に大規模なチームでは、誤ったデプロイが本番環境に影響を与えるリスクを避けるために、信頼されたメンバーのみにデプロイ権限を与える必要があります。このワークフローは、GitHubの特定のチームに所属しているかどうかを確認し、デプロイを制御します。
今回の場合はgithub-actions-executable
というチームを作成し、そちらにデプロイ可能なメンバーを追加します。
ワークフローの全体構造
以下のGitHub Actionsワークフローは、ユーザーが本番環境(prd
)にデプロイする際に、次のような流れで実行されます。
-
デプロイ環境の選択
workflow_dispatch
イベントを使用し、デプロイする環境を手動で選択します。 -
チームメンバーの確認
GitHub APIを使って、デプロイ実行者が指定のチーム(github-actions-executable
)に所属しているかどうかを確認します。 -
AWS ECSへのデプロイ
デプロイ実行者がチームメンバーであれば、AWS ECSにアーティファクトをデプロイします。
シチュエーション図
以下は、このワークフローがどのように実行されるかのフローです。
+-----------------------+ 手動デプロイ +---------------------------+
| workflow_dispatch | ------------> | Team Affiliation Check |
| (デプロイ環境選択) | | (チームメンバーか確認) |
+-----------------------+ +---------------------------+
|
v
+------------------------------------------+
| チームメンバーの場合、AWS ECSにデプロイ |
| (非メンバーなら実行停止) |
+------------------------------------------+
サンプルコード
name: Deploy ECS Prd
on:
workflow_dispatch:
inputs:
deployEnv:
type: choice
description: 'デプロイする環境を選択してください'
options:
- prd
required: true
default: ''
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
environment: ${{ inputs.deployEnv }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Check user for team affiliation
uses: tspascoal/get-user-teams-membership@v3
id: teamAffiliation
with:
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
username: ${{ github.actor }}
team: 'github-actions-executable'
- name: Stop workflow if user is no member
if: ${{ steps.teamAffiliation.outputs.isTeamMember == false }}
run: |
echo "You have no rights to trigger this job."
exit 1
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: ap-northeast-1
- name: Create artifact
run: |
zip -r /tmp/artifact.zip ./ -x *.git*
- name: Put artifact and meta file
run: |
aws s3 cp /tmp/artifact.zip s3://${{ secrets.SOURCE_ARTIFACT_S3_BUCKET_NAME }}/backend/artifact.zip