⽬次
- はじめに
- 処理の共通化とは
- 共通化の⽅法
- 最後に
1. はじめに
こんにちは。DXビジネス事業部のはしです。
今回は私が所属しているプロジェクトで利⽤している、GitHub Actionsの処理の共通化の⽅法を紹介します。
GitHub Actionsについては、以下の弊社ブログでも紹介していますので合わせてご覧ください。
2. 処理の共通化とは
現在私が所属しているチームでは⾃社サービスの開発を⾏っており、AWS上に環境を構築しています。
本番環境、ステージング環境、開発環境などがあり、それぞれの環境に対してCloudFormationとGitHub Actionsを利⽤しデプロイ処理を⾏っています。
各環境は、リソース名などの設定が⼀部異なっているものの構成は同⼀になっているため、GitHub Actionsで実⾏する内容もほぼ同⼀です。(VPC名が、vpc-prd-service, vpc-dev-service、となっているなど)
この場合、GitHub ActionsのYAMLファイルを1環境分を作成し、コピー&ペーストで複製するという⽅法もありますが、環境が増えると管理が煩雑になります。
また設定変更の際に、環境毎のYAMLファイルを変更するという作業も発⽣しミスの原因にもなりかねません。
そこで、重複している処理は共通化を⾏い管理の簡略化を⾏っています。
workflowsディレクトリ配下に各環境の設定ファイルを格納しており、リリース⽤ブランチにマージされた際に、それぞれの環境⽤の処理が実⾏されるようになっています。(開発環境⽤リリースブランチにマージされた際に、開発環境へデプロイを⾏う、など)
actionsディレクトリ配下には、workflowsディレクトリ配下の処理から呼び出される共通の処理を格納しています。
それぞれが、どのような設定を⾏っているかを以下に記載します。(記載している内容は本記事⽤に簡略化しています)
- workflowsディレクトリ配下の設定ファイル
- AWSアカウントの情報は、GitHub Secretsに登録しています
- 環境毎の設定は、引数として渡しています
name: sample-dev |
on: |
push: |
branches: |
- release/dev |
env: |
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID_DEV }} |
AWS_ROLE_ARN_INFRA: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID_DEV }}:role/role-github-actions-infra |
jobs: |
run_create_resources: |
runs-on: ubuntu-20.04 |
steps: |
- name: Checkout |
uses: actions/checkout@v3 |
- name: CreateResources |
uses: ./.github/actions/aws_create_resources |
with: |
TARGET_BRANCH_NAME: ${{ github.ref_name }} |
AWS_ACCOUNT_ID: ${{ env.AWS_ACCOUNT_ID }} |
AWS_ROLE_ARN: ${{ env.AWS_ROLE_ARN_INFRA }} |
AWS_REGION: ap-northeast-1 |
- actionsディレクトリ配下の設定ファイル
- iniファイルに設定した各環境⽤の値を取得し、GitHubの変数に設定しています
- 今回のプロジェクトでは、AWSリソース毎にCloudFormationテンプレートを作成し、必要なリ ソース分のテンプレートを呼び出すようにしています(VPCとELB以外のリソースの記載は省略し ています)
name: create-resources |
description: "This action creates AWS resources." |
inputs: |
TARGET_BRANCH_NAME: |
required: true |
description: "ブランチ名" |
AWS_ACCOUNT_ID: |
required: true |
description: "デプロイ先のAWSアカウントID" |
AWS_ROLE_ARN: |
required: true |
description: "CloudFormationを実行するIAMロール名" |
AWS_REGION: |
required: true |
description: "デプロイするAWSリージョン" |
runs: |
using: composite |
steps: |
- name: Set EnvironmentVariables |
shell: bash |
env: |
ENV_FILE: ./infra/env/cfn.ini |
run: | |
grep '${{ inputs.TARGET_BRANCH_NAME }}-' ${ENV_FILE} | sed 's|${{ inputs.TARGET_BRANCH_NAME }}-||' >> $GITHUB_ENV |
- name: Configure AWS Credentials |
uses: aws-actions/configure-aws-credentials@v2 |
with: |
role-to-assume: ${{ inputs.AWS_ROLE_ARN }} |
aws-region: ${{ inputs.AWS_REGION }} |
role-session-name: role-github-actions |
- name: Deploy CloudformationStack/VPC |
shell: bash |
env: |
CFN_TEMPLATE: ./infra/templates/vpc.yml |
run: | |
aws cloudformation deploy \ |
--stack-name ${{ env.CFN_PROJECT_NAME }}-${{ env.CFN_ENV }}-vpc \ |
--template-file ${CFN_TEMPLATE} \ |
--no-fail-on-empty-changeset |
- name: Deploy CloudformationStack/ELB |
shell: bash |
env: |
CFN_TEMPLATE: ./infra/templates/elb.yml |
run: | |
aws cloudformation deploy \ |
--stack-name ${{ env.CFN_PROJECT_NAME }}-${{ env.CFN_ENV }}-elb \ |
--template-file ${CFN_TEMPLATE} \ |
--no-fail-on-empty-changeset |
: |
: |
- cfn.ini
- 変数名の先頭は、各環境のリリース⽤ブランチ名にしています
# Prd |
release/prd-CFN_PROJECT_NAME=sample |
release/prd-CFN_ENV=prd |
# Stg |
release/stg-CFN_PROJECT_NAME=sample |
release/stg-CFN_ENV=stg |
# Dev |
release/dev-CFN_PROJECT_NAME=sample |
release/dev-CFN_ENV=dev |
4. 最後に
当初、本プロジェクトでは共通化をせずに、コピー&ペーストでYAMLファイルを複製していましたが、管理がし切れなくなり共通化を⾏うことにしました。
処理を共通化することによって、内容を変更 → 開発環境で確認 → 本番環境へ反映と、ちゃんと確認することができるようになった点と、変更箇所が少なくなったことで他のメンバーでも作業が可能になった点がメリットと感じています。
また、良く触れているLinuxのシェルのような感覚で処理を共有化が出来たため、個⼈的に作業は⾏いやすかったです。
まだこうした⽅が良いのかも・・・といった点はあるため、もっと使いやすいように継続して改善に取り組んでいきたいと思っています。