【CLI無し】CloudWatch Logs上のログデータをKinesis Data Firehoseを用いてリアルタイムでS3に2次保存する
今回はログデータをCloudWatch LogsだけでなくS3に2次保存する方法を紹介します。
Kinesis Data Firehoseを使うことでリアルタイムに収集することができます。

目次
はじめに
こんにちは。
クラウドソリューショングループのyoshikawa.kです。
この記事は アイソルート Advent Calendar 2021 2日目の記事です。
今回CloudWatch Logsにログを保存するだけでなく、S3にも”リアルタイム”で保存する方法があることを知ったので紹介します。
(Kinesis Data Firehoseを使ってみたかった)
Kinesis Data Firehoseを用いてリアルタイムでログをS3に収集することで、ログデータを適時取得・分析することができビジネスの最適化を行えます。
前提条件
・以降CloudWatch Logsを「CWL」、Kinesis Data Firehoseを「Firehose」と表記します。
・今回ログデータは実際のものを使用せず、CWL上で疑似的に作成します
S3バケットを作成
AWS管理コンソール上から「S3」サービス→左のメニューバーから「バケット」→画面中央付近の「バケットを作成」を選択します。
その後下記の表を参考にバケットを作成してください。

| 設定項目 | 設定値 | 補足 |
|---|---|---|
| バケット名 | handson-s3-log | バケット名は全アカウントで一意にする必要があるので、名称がかぶらないようにしてください |
| AWS リージョン | 東京 | デフォルト状態 |
| オブジェクト所有者 | ACL 無効 | デフォルト状態 |
| このバケットのブロックパブリックアクセス設定 | 「パブリックアクセスをすべて ブロック」にチェックを付ける | デフォルト状態 |
| バケットのバージョニング | 無効にする | デフォルト状態 |
| タグ | 追加しない | デフォルト状態 |
| デフォルトの暗号化 | 無効にする | デフォルト状態 |
| オブジェクトロック(詳細設定) | 無効にする | デフォルト状態 |
ほとんどの設定がデフォルト状態なので特に困るところはないと思います。
唯一注意点として今回バケット名を「handson-s3-log」としましたが、
バケット名は全AWSアカウント内で一意である必要があるので、皆さんは違う名前を付けてください。
もちろん最後は「バケットを作成」をしてくださいね。

Kinesis Data Firehoseを作成
AWS管理コンソール上から「Kinesis」サービス→左のメニューバーから「Delivery streams」→画面右上の「Create delivery stream」を選択します。
その後下記の表を参考にFirehoseを作成してください(記載していない設定はすべてデフォルトのままです)。

| 設定項目 | 設定値 |
|---|---|
| Source | Direct Put |
| Destination | Amazon S3 |
| Delivery stream name | handson-firehose-log |
| S3 bucket | s3;//”先ほど作成したバケット名” |
S3 bucketは横の「Browse」を選択すると先ほど作成したS3バケットが表示されるのでそれを選んでください。

残りの設定はデフォルト状態で大丈夫です。
画面下までスクロールし「Create delivery stream」をしてください。
IAMロールを作成
さあ残り半分ほどです!
お次は、CWLがFirehoseにログデータを渡す権限を付与するIAMロールを作成します。
AWS管理コンソール上から「IAM」サービス→左のメニューバーから「ロール」→画面中央付近の「ロールを作成」を選択します。

さて本記事の最難関ポイントです。
信頼されたエンティティの種類を選択で、AWSサービスのEC2を選択してください。
本当はCWLを選択したいのですが存在しないので、この後直接設定を変更することで対応します。
(つまり別にEC2じゃなくてLambdaとかを選んでもいいわけですが、ここでは設定を合わせるためEC2を選択してください)

検索欄に「firehose」を打つと下記の「AmazonKinesisFirehoseFullAccess」が出てくるので、そちらのポリシーを選択してください。

ロール名は「handson-iam-role-log」、ロールの説明は「-」を入力してください。

ロールを作成をしたら、忘れないうちに設定をEC2からCWLに修正します。
再度ロールの一覧画面に戻り、検索欄から先ほど作成したIAMロール「handson-iam-role-log」を入力し、選択してください。

画面を下にスクロールすると、「信頼関係」のタブが出てくるので開いて「信頼関係の編集」を選択してください。

すると、画面中央部分の Serviceが「ec2.amazonaws.com」になっているはずなので、「logs.ap-northeast-1.amazonaws.com」に変更しましょう。
以下、全文です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

ログデータを作成
ラストスパートです!
AWS管理コンソール上から「CloudWatch」サービス→左のメニューバーから「ロググループ」→画面中央付近の「ロググループを作成」を選択します。
その後ロググループ名に「handson-group-log」を入力し、画面右下の「作成」をしてください。

次に作成したロググループ「handson-group-log」を選択した状態で、「アクション」→「サブスクリプションフィルター」→「Create Kinesis Firehose subscription filter」を選択します。

下記の表を参考に(記載していないものはデフォルトのままです)、画面右下の「ストリーミングを開始」を選択してください。
| 設定項目 | 設定値 |
|---|---|
| Destination account | Current account |
| Kinesis Firehose delivery stream | handson-firehose-log(先ほど作成したFirehose) |
| Select an existing role | handson-iam-role-log(先ほど作成したIAMロール) |
| サブスクリプションフィルター名 | handson-filter-log |

次にロググループの管理画面から「handson-group-log」を選択すると、ログストリーム画面に移るので「ログストリームを作成」を選択してください。
ログストリーム名を「handson-stream-log」とし、「Create」をしてください。

最後に作成したログストリーム「handson-stream-log」を選択すると、ログイベント画面に移るので「アクション」→「ログイベントの作成」をしてください。
ログデータを入力できます(自分は「これはログです」と入力しました)。

S3に保存されているか確認
では、さきほど作成したログデータがS3に保存されているか確認しましょう。
数分後位にAWS管理コンソール上から「S3」サービス→左のメニューバーから「バケット」→先ほど作成した「handson-bucket-log」を選択→YYYY/MM/DD/HH/配下に、以下のようなファイルが存在するので選択状態のまま、画面中央付近のダウンロードを選択してください。

ダウンロードしたファイルは圧縮されているので、7zipで解凍してみると無事ログデータが保存されていました(一行が長いので右にスクロールしてください)!
{"messageType":"CONTROL_MESSAGE","owner":"CloudwatchLogs","logGroup":"","logStream":"","subscriptionFilters":[],"logEvents":[{"id":"","timestamp":1639584410120,"message":"CWL CONTROL MESSAGE: Checking health of destination Firehose."}]}{"messageType":"DATA_MESSAGE","owner":"xxxxxxxxxxxx","logGroup":"handson-group-log","logStream":"handson-stream-log","subscriptionFilters":["kj"],"logEvents":[{"id":"36563954908956428619808301847612703664483231098509328384","timestamp":1639584443634,"message":"これはログです!"}]}

まとめ
ふー!!お疲れ様でした!
作業自体は難しくないですが、手順多いのでどこかでミスしがちです。
自分はIAMロールの権限設定をミスりつっかえました。
ログデータをリアルタイムで取得・分析したい場合、Firehoseの導入を検討してみましょう!









