APIが先か? CloudWatch Logsのロールが先か?
2023-07-14
CloudWatch LogsのロールがないためにAPI Gatewayのデプロイに失敗したことはありませんか? このブログ投稿ではその解決方法を紹介します。
背景
AWS CloudFormation (CloudFormation)のスタックをデプロイする際に、次のようなエラーに遭遇したことはないですか?
Resource handler returned message: "CloudWatch Logs role ARN must be set in acc
ount settings to enable logging (Service: ApiGateway, Status Code: 400, Request
ID: 00000000-0000-0000-0000-000000000000)" (RequestToken: 00000000-0000-0000-00
00-000000000000, HandlerErrorCode: InvalidRequest)
このエラーの原因は単純(なはず)で、Amazon API Gateway (API Gateway)用のAmazon CloudWatch Logs (CloudWatch Logs)ロールを設定していないからです。 ということで解決方法も単純で、CloudWatch LogsロールをAPI Gatewayに設定するだけです。以上!
ところが、アカウントにAPI GatewayのAPIをまだ一度もデプロイしたことがない場合は単純には解決しません。 API Gatewayのコンソールは、少なくともひとつ以上のAPIをデプロイしない限りCloudWatch Logsのロールを設定するページを表示してくれないのです。
解決方法
考えられる解決方法は:
- API Gatewayのコンソールを介する方法: ログを無効にしてAPIをデプロイした後、API GatewayのコンソールでCloudWatch Logsのロールを設定。 それからログを有効にしてAPIを再デプロイする。
- AWS CLIを介する方法: CloudWatch LogsのロールをAWS CLIを介して設定。 それからログを有効にしてAPIをデプロイする。
- CDK*を介する方法: CDKで
RestApi
を設定する際にcloudWatchRole
プロパティを有効にする。 お勧めしません。
次の節で、2番目の方法を紹介します。
節「なぜcloudWatchRoleを有効化すべきでないか?」では、なぜcloudWatchRole
を有効化すべきでないかについても解説します。
* CDK: AWS Cloud Development Kit
AWS CLIを介してCloudWatch Logsロールを設定する
API Gateway用のCloudWatch Logsロールを設定するのに使うAWS CLIのコマンドはどれでしょうか?
残念なことに、AWSのドキュメント [1]はAWS CLIを介して設定する方法をなぜか紹介していません。
実は apigateway update-account
がそのコマンド [2]なのですが、
分かりにくくないですか?
それはさておき、コマンドのサンプルではまさにCloudWatch Logsのロールを設定する方法を紹介しています。
IAMロールを作成する方法はこの投稿の範囲外ですが、補足で紹介します。
なぜcloudWatchRoleを有効化すべきでないか?
cloudWatchRole
オプションを使うとお手軽な気がしますが、将来的に分かりにくいエラーが起きる可能性があります。
問題が起こる可能性があるのはCDK (CloudFormation)スタックを削除したときです。 スタックを削除すると、そのスタックが確保したCloudWatch Logsのロールも同時に削除されます。 CloudWatch Logsロールはアカウントレベルの設定なので、アカウント内の他のすべてのAPIが存在しないロールのせいでクラッシュし始めます。
まとめ
この投稿では、以下を紹介しました。
補足
API Gatewayのログ用のIAMロールを作成する
以下のステップで、AWS CLIを使ってAPI Gatewayのログ用のIAMロールを作成・設定できます。
-
apigateway.amazonaws.com
が引き受ける(assume)ことのできるIAMロールを作成 -
ステップ1で作成したIAMロールにAWSのマネージドポリシー
AmazonAPIGatewayPushToCloudWatchLogs
を追加