kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Amplify Hosting を CloudFormation と GitHub の Personal Access Tokens でデプロイする

AWS Amplify Hosting に GitHub からフロントエンドアプリケーションをデプロイする構成を AWS CloudFormation で構築する機会があった.AWS Amplify Hosting はコンソールだと比較的簡単にデプロイできるけど,今回は AWS CloudFormation と GitHub の Personal Access Tokens (PAT) を組み合わせてデプロイしたため,検証時に使ったテンプレートを汎化してまとめておく❗️

ドキュメントとしては以下を読んでおくと良いと思う💡AWS Amplify Hosting と GitHub Apps を連携する手順がまとまっている📝

docs.aws.amazon.com

GitHub Apps (AWS Amplify)

まず最初に AWS Amplify の GitHub Apps をセットアップする.例えば「東京リージョン」なら https://github.com/apps/aws-amplify-ap-northeast-1/installations/new にアクセスして,Permissions を与えておく.リポジトリを選択する設定では,基本的には All repositories ではなく Only select repositories で対象リポジトリを個別に選択するのが良いと思う👌

Personal Access Tokens (PAT)

次に AWS CloudFormation で使う GitHub の Personal Access Tokens (PAT) を取得する.現時点だとトークンは classicFine-grained (Beta) の2種類があるけど,今回はドキュメントに載っている手順に沿って classic を使う.重要なのは Select scopes でトークンに指定するスコープで admin:repo_hook を許可しておくところ❗️

ちなみに GitHub ドキュメントだと 可能な限り、personal access tokens (classic) ではなく fine-grained personal access token を使用することをお勧めします。 と書いてある.

docs.github.com

AWS CloudFormation テンプレート

最後は AWS CloudFormation を使って AWS Amplify Hosting アプリケーションをデプロイする.ポイントは AccessToken に取得した GitHub の Personal Access Tokens (PAT) を設定するところ❗️しかし,テンプレートに直接 Personal Access Tokens (PAT) を設定するのは避けるべきで,今回は以下の3種類のテンプレートを準備してみた❗️

  • AWS Secrets Manager
  • AWS Systems Manager Parameter Store
  • Parameters (NoEcho)

docs.aws.amazon.com

1. AWS Secrets Manager

AWS Secrets Manager を使うと Personal Access Tokens (PAT) の管理を外部化できて,暗号化もできて,選択肢の中では1番良いと思う✌️今回は GitHubPat というシークレットを登録した.

AWSTemplateFormatVersion: 2010-09-09

Resources:
  AmplifyApp:
    Type: AWS::Amplify::App
    Properties:
      Name: sandbox-app-secrets-manager
      Repository: https://github.com/kakakakakku/xxxxx
      AutoBranchCreationConfig:
        EnableAutoBranchCreation: true
        EnableAutoBuild: true
      EnableBranchAutoDeletion: true
      AccessToken: '{{resolve:secretsmanager:GitHubPat:SecretString:GitHubPat}}'
  MasterBranch:
    Type: AWS::Amplify::Branch
    Properties:
      AppId: !GetAtt AmplifyApp.AppId
      BranchName: master
      EnableAutoBuild: true

2. AWS Systems Manager Parameter Store

AWS Systems Manager Parameter Store を使っても Personal Access Tokens (PAT) の管理を外部化できるけど,SecureString のパラメータを埋め込めるサービスは一部しかなく制約がある.よって,今回は StringGitHubPat というパラメータを登録した.

docs.aws.amazon.com

AWSTemplateFormatVersion: 2010-09-09

Resources:
  AmplifyApp:
    Type: AWS::Amplify::App
    Properties:
      Name: sandbox-app-secrets-manager
      Repository: https://github.com/kakakakakku/xxxxx
      AutoBranchCreationConfig:
        EnableAutoBranchCreation: true
        EnableAutoBuild: true
      EnableBranchAutoDeletion: true
      AccessToken: '{{resolve:ssm:GitHubPat}}'
  MasterBranch:
    Type: AWS::Amplify::Branch
    Properties:
      AppId: !GetAtt AmplifyApp.AppId
      BranchName: master
      EnableAutoBuild: true

3. Parameters (NoEcho)

選択肢の中で一番簡単に実現できるのは AWS CloudFormation の Parameters で,NoEcho を設定することでパラメータを ***** としてマスキングできる(あくまで表示上).

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  GitHubPat:
    Type: String
    Default: ''
    NoEcho: true

Resources:
  AmplifyApp:
    Type: AWS::Amplify::App
    Properties:
      Name: sandbox-app-parameters-noecho
      Repository: https://github.com/kakakakakku/xxxxx
      AutoBranchCreationConfig:
        EnableAutoBranchCreation: true
        EnableAutoBuild: true
      EnableBranchAutoDeletion: true
      AccessToken: !Ref GitHubPat
  MasterBranch:
    Type: AWS::Amplify::Branch
    Properties:
      AppId: !GetAtt AmplifyApp.AppId
      BranchName: master
      EnableAutoBuild: true

まとめ

コンソールだと比較的簡単にデプロイできるのに AWS CloudFormation 化をしようとすると悩んだりすることはよくある❗️今回は CloudFormation と GitHub の Personal Access Tokens で AWS Amplify Hosting アプリケーションをデプロイするテンプレートを3種類準備してみた.誰かの参考になれば〜💡