はじめに
今回はGitHubActionsにて、同じCFnテンプレートを複数のAWS環境にデプロイすることとなり、それを記事として残していきたいと思います。
S3を例にGithubActionsの作成からCFnでの構築までを記述します。
目次
・GitHubActions
・CloudFormation
・最後に
・参考
GitHubActions
GithubActionsが下記になります。
{AWSAccountId_A},{AWSAccountId_B},{IAMRole}は、任意の値を変更してください。
on:
にてenvironment
を追加することで、環境を選択するように設定します。
defaultをdev
にすることで間違えて本番環境を選択するリスクを下げることをしています。
また、aws-deploy
でAWS環境設定をする前に変数設定で、AWSアカウントを環境毎に変更したり、CFnに上書きするパラメータを変更しています。
name: Deploy-s3
on:
workflow_dispatch:
inputs:
environment:
description: 'Deployment Environment'
required: true
default: 'dev'
type: choice
options:
- dev
- pro
permissions:
id-token: write
contents: read
jobs:
aws-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# 変数設定(AccountID、Cfnの環境変数)
- name: Set AWS account ID based on environment
id: set-aws-account-id
run: |
if [ '${{ github.event.inputs.environment }}' == 'pro' ]; then
echo "AWS_ACCOUNT_ID={AWSAccountId_A}" >> $GITHUB_ENV
echo "AWS_CFN_ENV=pro" >> $GITHUB_ENV
else
echo "AWS_ACCOUNT_ID={AWSAccountId_B}" >> $GITHUB_ENV
echo "AWS_CFN_ENV=dev" >> $GITHUB_ENV
fi
# IAMロール&リージョン設定
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1-node16
with:
role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/{IAMRole}
aws-region: ap-northeast-1
- name: cloudformation
run: aws cloudformation deploy --stack-name Deployment-S3 --template-file s3.yaml --parameter-overrides Environment=${{ env.AWS_CFN_ENV }}
working-directory: ./3_S3
CloudFormation
CloudFormationが下記になります。
GitHubActionsにてParametersのEnvironment
を上書きし、
Mapping
を使って、環境毎に値を変更したいものがあるものはこちらで変数を設定します。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
s3bucket deployment
#------------------------------------------------------------#
#Parameters
#------------------------------------------------------------#
Parameters:
PJPrefix:
Description: Project Name
Type: String
Default: pj-ogataro
AllowedPattern: ^[a-zA-Z0-9\-]*$
Environment:
Description: Environment Name
Type: String
Default: dev
AllowedPattern: ^[a-zA-Z0-9\-]*$
#------------------------------------------------------------#
#Mapping
#------------------------------------------------------------#
Mappings:
MapEnv:
dev:
TagName: Develop-S3
pro:
TagName: Product-S3
#------------------------------------------------------------#
#Resources
#------------------------------------------------------------#
Resources:
PatentS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub '${PJPrefix}-${Environment}-storage'
VersioningConfiguration:
Status: Enabled
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
Tags:
- Key: Name
Value: !Sub
- '${TagName}'
- TagName: !FindInMap [MapEnv, !Ref Environment, TagName]
動作確認
GitHubActionsで実際にRun workflow
を実行する際、下記のような状態に変化します。
Deployment Environment
の箇所で環境を選択できるようにしています。
こちらでpro
を選択し、実行するとJobのログで下記のように表示されるのを確認し、最後にAWS環境にて正常にS3の名前にpro
が反映されていることを確認します。
最後に
GitHubActionsでデプロイするAWS環境を変更する手順は完了です。
参考になれば、幸いです。
参考サイト
GitHubActions