凡ミスまとめ
ELBが1/2の確率でレスポンスを返さない
ELBが2AZで、ターゲットのECSがコストの都合で1AZにしか置いてない状態。
片側(ECSを置いてない方のAZ)のELBからECSに通信が届いてないのかと思いましたが、ELBを置いたパブリックサブネットに対してIGWへのルーティングを設定し忘れていただけでした。
Access-Control-Allow-Originしてるのにフロントからバックエンドに接続できない
フロントエンドのドメイン名をセットしていましたが、httpsなどのプロトコル名まで含めて指定する必要がありました。
×: w.Header().Set("Access-Control-Allow-Origin", "frontend.example.com") ○: w.Header().Set("Access-Control-Allow-Origin", "https://frontend.example.com")
Cloudfront経由でヘッダ(Authorizationなど)がバックエンドのオリジンに送られない
cloudfrontのオリジンリクエストポリシーでAllViewerを指定することで全てのヘッダをオリジンに送ることができる。
Set-Cookieしたのにcookieがセットされてない
バックエンドとフロントエンド(SPA)のドメインが異なる状況だったので、cookieのSameSiteをNoneにする必要がありました。
return &http.Cookie{ ~~ SameSite: http.SameSiteNoneMode,
ECS内のアプリケーションからIAMロールが読み込めない
アプリ内で使用する権限をタスク実行ロールに付与していたため。
タスク実行ロールとは別にタスクロールが存在し、アプリ内で必要な権限はタスクロールの方に付与する。
ECS上のバックエンドから外部にhttpsアクセスできない
ca-certificates
というパッケージを入れる必要がある。
cloudfrontでreactページがルート以外アクセスできない
パスに対応したhtmlファイルが存在しないのでエラーになってしまう。
cloudfrontのエラーページタブから、発生するエラーコードに対して/index.htmlと200を設定し、どんなパスにもindex.htmlを返すようにする。
特定のページでだけuncaught syntaxerror: unexpected token '<'
具体的な挙動はわからないもののreactのpackage.jsonに以下を追記すればどうにかなる(ならなかったらごめん)
"homepage": "/",