株式会社ダイアログ Tech Blog

株式会社ダイアログのエンジニアチームが運営しています。

Amplifyのoverride.tsで環境名を取得する

課題

Amplify CLIではAuthなどのCFnテンプレートを上書きするためのファイルとして、override.tsが提供されています。このoverride.tsはaws-cdk内の一部のメソッドのみを利用できるようになっています。 本来、getProjectInfo()でAmplifyのプロジェクトの詳細を取得することができるのですが、2022/2/28現在このメソッドはアクセス権限に関する以下のエラーが発生するため利用できません。

⠇ Building resource storage/MyStorage🛑 Error: Skipping override due to VMError: Access denied to require 'os'

override.ts内で環境名を取得する必要がある場合、上記メソッドを使わずに取得する方法をご紹介します。

解決策

※注意 本記事で紹介する解決策は邪道です。issue(https://github.com/aws-amplify/amplify-cli/issues/9063 )が対応され次第修正した方が良いです。

Amplify CLIではプロジェクトの環境等のメタ情報をamplify/backend/amplify-meta.jsonにて保持しています。このファイルはamplify env checkout ...などのコマンドで環境が変更された際、amplify/team-provider-info.jsonの情報を元に構築されるものです。今回はここから環境名を取得します。

手順1:amplify-meta.jsonのモジュール化

amplify-meta.jsonをモジュールとしてシンボリックリンクを貼ります。ファイルを直接読みにいくことも可能のようですが、私の環境ではエラーが発生し読み込めなかったためこの手順を踏んでいます

cd amplify/backend
yarn add link:./amplify-meta.json

手順2:override内でStackNameの取得

amplify-meta.jsonのStackNameを取得します。StackNameはamplify-[プロジェクト名]-[環境名]-[プロジェクト番号]で構成されているため、文字列を分解すれば環境名を取得することができます。

export function override(resources: AmplifyAuthCognitoStackTemplate) {
  const amplify_meta_json = require('amplify-meta.json')
  const env_name = amplify_meta_json.providers.awscloudformation.StackName.split("-").slice(-2, -1).pop()
//省略
}

まとめ

override.ts内で環境名を取得する機会は多いと思われるので、誰かの参考になれば幸いです。 また、この対応はissue内のcespin氏を参考にしております。この場を借りてお礼申し上げます。

参考