GitHubActionsでデプロイするAWS環境を簡単に変更したい

# はじめに
今回はGitHubActionsにて、同じCFnテンプレートを複数のAWS環境にデプロイすることとなり、それを記事として残していきたいと思います。
S3を例にGithubActionsの作成からCFnでの構築までを記述します。

# 目次
・GitHubActions
・CloudFormation
・最後に
・参考

# GitHubActions
GithubActionsが下記になります。
{AWSAccountId_A},{AWSAccountId_B},{IAMRole}は、任意の値を変更してください。

`on:`にて`environment`を追加することで、環境を選択するように設定します。
defaultを`dev`にすることで間違えて本番環境を選択するリスクを下げることをしています。

また、`aws-deploy`でAWS環境設定をする前に変数設定で、AWSアカウントを環境毎に変更したり、CFnに上書きするパラメータを変更しています。

```yaml:Deploy-s3.yaml
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`を使って、環境毎に値を変更したいものがあるものはこちらで変数を設定します。

```yaml:s3.yaml
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`の箇所で環境を選択できるようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/483cb65e-13f2-ed79-d279-00f4a70349bd.png)

こちらで`pro`を選択し、実行するとJobのログで下記のように表示されるのを確認し、最後にAWS環境にて正常にS3の名前に`pro`が反映されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/78813bc4-659d-3fac-6e97-3041154b61e1.png)


# 最後に
GitHubActionsでデプロイするAWS環境を変更する手順は完了です。
参考になれば、幸いです。

# 参考サイト
GitHubActions

https://docs.github.com/ja/actions/writing-workflows/workflow-syntax-for-github-actions