2022年7月時点の内容になります。
投稿後に原因が改善されている可能性があります。
背景
今までAmplifyでホスティングを行いたい時はAmplifyCLIを使ってましたが、今年に入ってAWSの構築をCloudFormatinからCDKに移した事もあって、Amplifyはどっちに寄せようか考える機会がありました。
Amplifyで立てたバックエンドリソースをエクスポート機能を使ってCDKでも扱えるようにして、overrideで設定をカスタマイズする方法を取ることも考慮したのですが、その時点でAmplifyCLIの用途がホスティングくらいでバックエンドはCDKで用意することにしていたことと、エクスポート&overrideは工程がやや煩雑になるのを嫌って、ならいっそCDKに統一してみるかと決めました。
CDKによるホスティング自体は問題なく終わったのですが、Amplifyの自動ビルドが実行されない事象が発生し、原因自体は小ネタでしたが個人的に「そんなことが・・・」だったので、ニッチなケースとは思いつつも、何処かの誰かが同じ事象でハマって貴重な時間を消費するのを未然に防げればいいなと思い書いてきます。
タグで内容を何となく察したあなたはきっと同士。
事象詳細
// 抜粋
const stgbranch = new amplify.CfnBranch(this, `${name}-stg`, {
appId: app.attrAppId,
branchName: 'stg',
enableAutoBuild: true, // 自動ビルド有効化
enablePerformanceMode: false,
enablePullRequestPreview: false
})
-
コンソールから手動でビルドを実行するときっちりGitbhubからソースコードを持ってきてCI/CDは全て最後まで成功する
-
GitHubのブランチに"master"がないと上手く動かないというissueがあったので"master"ブランチを作って見たがやはり動かない
-
同じGitHubのリポジトリを使ってCDKではなく最初からコンソールでホスティングすると問題なく自動ビルドが実行される
-
CDK経由でホスティングしたAmplifyアプリケーションに対してブランチを追加を試みるも、GitHub認証は成功するが、接続候補のGitHubブランチの選択画面が表示されない
-
GitHubアクセストークンの権限に不備でもあるのかと念の為の切り分けとして、awscliで同アクセストークンを用いてAmplifyアプリケーションを作成すると問題なく自動ビルドが実行される
-
コンソール上から「リポジトリを再接続」を実行すると"We do not have permission to access this repository. Please update your permissions and try again."のエラーが出る
- Permissionを確認するが問題ない
- このエラーにissueが上がっていたので念の為、提示されているcliコマンドを実行してupdateをかけるもやはり自動ビルドは実行されない
- https://github.com/aws-amplify/amplify-hosting/issues/2730
- Permissionを確認するが問題ない
つまるところ、GitHubとの接続に対して繋がっている
けど繋がっていない
みたいな状況に陥ってました。
原因
対象のCDKではAmplifyだけでなくVPCやS3、Cloudfront、Aurora、ECSやCodeBuild、Security周りなどその他多くのリソースをスタックを分けて定義されてます。また、Amplifyに用いる接続先GitHubリポジトリはcdk.jsonで指定しており、元々定義していたCodeBuildと共用しておりました。それが宜しくなかった…。
CodeBuildではリポジトリへのHTTPSクローンURLhttps://github.com/xxx/xxx.git
を指定する為、cdk.jsonにもそのように記述してました。しかし、Amplifyではまさかの.git
が含まれたリポジトリURLを指定すると、今回の事象が発生してしまうという事がAWSサポートの方から教えて頂きました。
改めてCDKとCloudFormationのドキュメント(AmplifyのCDKはL1しか対応してない為)を確認しましたが、string型の指定くらいしか書かれてなかったので、まあ気付くわけもなく。
repository?
Type: string (optional)
The repository for an Amplify app.
Pattern: (?s).*
AWSあるあるな、「Delete me」か「削除」みたいなサービスによる違いに当たったんだなあと、当時遠い空を見上げました。
今回は引き続きCodeBuildと共用させるため、cdj.jsonをいじらずにamplify側のスタックで.git
を除外させて改めてアプリケーションを立てる事で漸く自動ビルドが実行され事象が解消されるに至りました。
グッドエンドを辿るには
CDKを書いたことがある人なら共感してくれると思いますが、CDKでリソースを記述する際公式のドキュメントをまず読んであれことと書くんですが、あちこちページを跨ぐ必要があったり、十分に量はありつつもそれでもいまいち分かり辛かったりしますよね。
自分はGitHubで検索かけて他所様はこのリソースのこの部分どう指定してるんやろな〜と探しに行ったりしていて、サンプルは少ないですがよくよく読むとそこでは.git
抜きで書かれているのが見つかるので、頑張れば気付けなくもなかったかもしれない
最後に
気付いてしまえばとても些細なものでしたが、コンソール上で「ビルドを実行」を押すとビルドが実行されることからGitHubとの接続と認証が中途半端ではあるものの一応は出来ている事もあり、原因特定に非常に難儀しました。原因究明に協力してくださったAWSサポートの方々には感謝申し上げます。
参考