🔖

@aws-cdk/aws-amplify » App の addDomainを使ってはいけない

2021/06/01に公開2

TL;DR

  • Amplifyではドメイン指定時、その前に接続先のブランチが作成されている必要がある
  • にも関わらずCloudFormationの AWS:Amplify:Domain リソースでは、ブランチ名を文字列で取る
  • したがってCloudFormationでAmplifyにドメイン付与する際はBranchに対する明示的なDependencyを指定する必要がある
  • CDKはそんなこと考慮してくれない。

トラブルシュート

このようなエラーが発生します。しかし main ブランチは存在するので、はぁ?となります。

A sub-domain can not point to a non existing branch: main

ここでの branch とは、リポジトリのブランチではなくAmplify AppのBranchリソースを指しています。
したがって、先に AWS:Amplify:Branchリソースができている必要があるんですね。

所感

CloudFormation の AWS:Amplify:Domain リソースをデザインしたAWSのエンジニアには反省を求めたい。
もしくは私の想像のつかない深い事情があるのかもしれない...

GitHubで編集を提案

Discussion

yamatatsuyamatatsu

CFnで書く場合

CFnのDocを見ると

{
  "BranchName" : { 'Fn::GetAtt': ['BranchResource', 'BranchName'], },
}

と書くことでbranch nameが取れるので、これを使えばDependencyで指定する必要はないかと思います

CDKのCfnプレフィックスなクラス(L1)を使う場合

{
  branchName: branch.attrBranchName,
}

とすることで、上記のCFnと同じテンプレートを吐き出せるので、同じくCFnに依存関係を教えた上でbranch nameを参照できそうです。
加えて、CDKでも明示的に依存関係を示すことはできます。

domain.node.addDependency(branch)

CDKのL2を使う場合

Branchクラスにてbranch.branchNameattrBranchNameを差してあげててDomainクラスでそれを使ってるので、L2のクラスを使って書けばCFn上で依存関係は示されるかと思います。

const app = new amplify.App(this, "MyApp", {});
const branch = app.addBranch("MyBranch");
const domain = app.addDomain("MyDomain", {
  subDomains: [{ branch }],
});
// Or
domain.mapSubDomain(branch);
yamatatsuyamatatsu

addDomainについて言及してらっしゃるのでL2を使ってらっしゃるのですね。。。パッとコードを見る限り、2年前には割と完成している機能ではあるのですが、CDKかCFnのどちらかにバグがあるのかもしれません。もし最新版でも再現できるのであればissueを建てると解決してもらえそうです!