課題
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
、amplify/backend/backend-config.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氏を参考にしております。この場を借りてお礼申し上げます。