API Gateway アクセスログの送信先をCloudWatchロググループ ⇨ Firehoseストリームへ変更する

## はじめに
API Gateway アクセスログの送信先をCloudWatchロググループ ⇨ Firehoseストリームへ変更する対応を行ったので備忘録として記録しておきます。

## 目次
1. [対応内容🔖](#対応内容)
2. [Firehoseストリームの作成](#firehoseストリームの作成)
3. [APIGatewayログとトレースの編集](#apigatewayログとトレースの編集)
4. [processing-failedフォルダへ記録される場合](#processing-failedフォルダへ記録される場合)
5. [まとめ📝](#まとめ)
6. [参考文献🌟](#参考文献)

## 対応内容🔖
送信先変更に伴い、必要な作業は以下の２ステップです。
1. API Gateway アクセスログの送信先およびS3へのログデータ配信元となるFirehoseストリームを新規作成する。
2. API Gatewayの`ログとトレースの編集`にて、作成したFirehoseストリームARNをアクセスログの送信先として設定する。

ただ、実際試してみていくつか注意点・沼った部分ありましたのでそこも含めて以降に詳細を記載します！
<b>※以降、添付上のリソース名等はマスクしていますのでご了承ください。</b>

## Firehoseストリームの作成
まずは、アクセスログの送信先となるFirehoseストリームを作成します。
* AWSコンソールから```Firehoseストリーム```で検索 > Amazon Data Firehoseのページを開く > 右上にある```Firehose ストリームを作成```をクリック

### Firehoseストリーム名の詳細
* ストリーム名を入力
* ソース：```Direct PUT```を選択
* 送信先：Amazon S3を選択
* データ変換・動的パーティショニング：なし
* ```変更を保存```をクリック

![スクリーンショット 2025-03-05 10.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/aae1527e-b0e8-4b05-8b97-02d07da8cca2.png)
👆<b>ストリーム名は必ず```amazon-apigateway-```から始まる名前にしてください❗️</b>

※ `amazon-apigateway-`と付かないストリームは、[AWS公式ガイド > 5 > bの注記](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-logging-to-kinesis.html#set-up-kinesis-access-logging-using-console)の通り、<b>API Gatewayのアクセスログの送信先ARNとして設定できません❗️</b>

### レコードを編集、変換、および転換
* 何もせずに```変更を保存```をクリック

![スクリーンショット 2025-03-05 10.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/5a5c0bdd-2536-4a4a-9747-421bb81fc04b.png)

### 送信先の設定
* ログデータの配信先となるS3バケットURLを入力
* S3バケットプレフィックスは、```apigateway/```等の分かりやすいものを入力
* バッファサイズ・バッファ間隔を入力
* その他設定はデフォルトのまま、```変更を保存```をクリック

![スクリーンショット 2025-03-05 10.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/cb67f744-c5a6-45df-ab58-075a133f074e.png)
![スクリーンショット 2025-03-05 10.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/9c2818a4-f784-4a6a-99cf-e0266fd27eac.png)
![スクリーンショット 2025-03-05 10.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/e0ee5d0b-7fff-4c1b-941b-6e35ba385ed6.png)

### サーバー側の暗号化を編集
* 何もせずに```変更を保存```をクリック

![スクリーンショット 2025-03-05 10.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/b57e634d-a543-4448-9198-6fb98096cd18.png)


### Amazon CloudWatch エラーのログ記録を編集
* 何もせずに```変更を保存```をクリック
(自分の場合、本Firehoseストリームはアクセスログ配信専用のため無効)

![スクリーンショット 2025-03-05 10.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/8c2bbd0c-f46a-4e20-a5cd-e4ff86452588.png)

### サービスアクセスを編集
* ```既存のIAMロールを選択```から対象となるロールを選択(<b>※なければ要作成</b>)
* ```変更を保存```をクリック

![スクリーンショット 2025-03-05 10.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/5c084a7f-cf4a-4c5f-a833-5b2a67ff63d6.png)

### タグを編集
* 必要あれば任意のタグを追加
例：環境名やプロジェクト名
　・キー：Env、値：dev
　・キー：Project、値：myProject

![スクリーンショット 2025-03-05 10.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/20e7a1f5-c4eb-4e93-b2a8-f0f8ed21a3b1.png)

## APIGatewayログとトレースの編集
Firehoseストリームが作成できれば、あとはそれをAPI Gatewayのアクセスログの送信先として設定するだけです！

* API Gatewayを開く > API > 対象APIを選択 > ステージ > ログとトレースの編集
* ```アクセスログの送信先 ARN```へ上記で新規作成したFirehoseストリームARNを設定
* ```変更を保存```をクリック

![スクリーンショット 2025-03-05 10.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/7b38834d-4cd7-4acb-b882-bb5193d70f9a.png)

対応内容としては以上です❗️
この後は、ログの配信先となっているS3バケットへ意図する問題なくログが記録されるか確認してみてください。

## processing-failedフォルダへ記録される場合
Firehoseストリームの設定に問題がなければ、API Gatewayから直接Firehoseストリーム経由でS3バケットへログが配信されるかと思います。
ただ仮に、S3バケット内の```processing-failed```フォルダにログが記録されるようであれば以下をご確認ください❗️

* Firehoseストリームの`サービスアクセス`で設定しているIAMロールにアクセス権限があるか
* Firehoseストリームの詳細で、`データ変換`が有効化されていないか
⇨ データ変換は<b>CloudWatchLogsへログを記録する際に必要な設定</b>です。
　 なので、直接Firehoseストリーム経由でS3保存であれば<b>不要な設定</b>となります。

![スクリーンショット 2025-03-05 10.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3427082/9ff3ebb9-adcc-4bb4-a86d-69905d19dc03.png)

## まとめ📝
* API Gateway アクセスログの送信先として設定するFirehoseストリーム名は、必ずイニシャルに```amazon-apigateway-```を付ける必要がある。
* S3へのログ配信時に```processing-failed```になる場合は、以下を確認すると良い。
    * IAMロール側のアクセス権限が許可されているか
    * Firehoseストリームのデータ変換が有効化されていないか

## 参考文献🌟
* [API Gateway コンソールを使用して Firehose アクセスログ記録を設定する](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-logging-to-kinesis.html#set-up-kinesis-access-logging-using-console)
* [Kinesis Data Firehose で「Lambda.InvokeAccessDenied」が発生するときの対処法](https://dev.classmethod.jp/articles/tsnote-what-to-do-when-lambda-invokeaccessdenied-occurs-in-kinesis-data-firehose/)