CloudWatch logsのログをS3に送信するために、Kinesis Data Firehoseを使って送信するためのシステムをマネジメントコンソールのみで作成していきます。
マネジメントコンソールを使ってS3へログを送信するためには、S3バケットはKinesisと同一のアカウントにある必要があります。
クロスアカウントのS3バケットに送信する場合など自分のアカウント内だけで完結しない処理の場合CLI を使う必要がありますのでご注意下さい。
作成するもの
今回の検証では、Firehoseは暗号化せずに自分のアカウント内のバケットに送信するものを作成します。
・IAM(Firehose用)
・IAM(Cloudwatch用)
・S3バケット
・Kinesis Data Firehose
・CloudWatch(ロググループ)
・CloudWatch(サブスクリプションフィルタ)
IAMロールを作成する
2つのロールが必要になります。
Firehose用
まずはFirehose用のIAMロールを作成します。

ロールの作成画面からユースケースでKinesisで検索し、「Kinesis Firehose」を選択して「次へ」を押してください。


追加するポリシーは「CloudWatchLogsFullAccess」と「AmazonS3FullAccess」です。
今回は検証のためFullAccessのポリシーを使用しますが、必要に応じて権限は絞って設定してください。
ロールの名前は「dev-kinesis」という名前で作成します。
Cloudwatch Logs用
次にCloudwatch Logs用のIAMロールを作成します。
マネジメントコンソールからは通常の選択肢からこのロールを作成することはできないので、信頼ポリシーを修正することで作成します。

ロールの作成画面からユースケースは適当なものを選択して下さい。
今回はEC2を選択して「次へ」を押します。


追加するポリシーは「AmazonKinesisFirehoseFullAccess」と「IAMFullAccess」です。
今回は検証のためFullAccessのポリシーを使用しますが、必要に応じて権限は絞って設定してください。
ロールの名前は「dev-logs」という名前で作成します。
作成したロールの信頼ポリシーを修正します。
現在の信頼ポリシーは下の画像のようになっております。
信頼ポリシーを編集を選択します。

修正前
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
修正後
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.ap-northeast-1.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
修正した箇所は「Service」の部分のみです。
修正が完了したらポリシーを更新しましょう。
これでIAMの作成は完了です。
S3バケットの作成
マネジメントコンソールからS3バケットを作成します。
設定する項目はバケット名のみであとは全てデフォルト値で大丈夫です。
バケット名は一意である必要がある為、すでに存在していた場合は別のバケット名で作成して下さい。

Kinesis Data Firehoseの作成
Kinesisには複数の種類がありますが、今回は「Delivery streams」から作成します。
「Create delivery streams」を選択します。

設定値は以下に表の様に設定します。
記載していない設定値は全てデフォルトにしています。
項目 | 値 |
---|---|
Choose source and destination | |
Source | Direct PUT |
Destination | Amazon S3 |
Delivery stream name | |
Delivery stream name | dev-stream |
Destination settings | |
S3 bucket | 先程作成したもの |
Advanced settings | |
Permissions | Choose existing IAM role |
Existing IAM roles | dev-kinesis |
全ての設定が完了したら「Create delivery stream」を押して作成します。
数分ほどで作成が完了し、StatusがActiveになります。

CloudWatch(ロググループ)の作成
S3に送信するロググループを作成します。
既存のロググループがあればそちらを利用しても問題ありません。
「ロググループを作成」を選択します。

ロググループ名は「dev-loggroup」にして、他は全てデフォルトの設定で「作成」をクリックします。

CloudWatch(サブスクリプションフィルタ)の作成
先ほど作成したロググループを選択します。
「アクション」>「サブスクリプションフィルター」>「Create Kinesis Firehose subscription filter」
と選択していきます。

設定値は以下の表の様にします。
記載していない設定値は全てデフォルトにしています。
送信先を選択 | |
Kinesis Firehose delivery stream | dev-stream |
Grant permission | |
Select an existing role | dev-logs |
ログ形式とフィルターを設定 | |
サブスクリプションフィルター名 | dev-subscriptionfilter |
設定の入力が完了したら「ストリーミングを開始」をクリックします。

これでログをS3バケットに送信する準備が完了しました。
ログの送信を確かめる
ログを送る前の状態のS3バケット内のオブジェクトを確認します。

確認したらCloudWatchのロググループに戻り、作成したロググループ「dev-loggroup」をクリックします。
次に、「ログストリームを作成」を選択します。

ログストリームの名前は適当なもので良いです。
今回は「test-stream」にしてCreateをクリックします。

作成したログストリームをクリックします。

アクション>ログイベントの作成

イベントメッセージは適当なもので良いです。
今回は「test-message」にしました。

これでサブスクリプションフィルタが設定されたロググループ内で、仮想のログが格納されたのでS3バケットにログが送信されているはずです。
S3バケットを確認すると先ほどまでなかったプレフィックスが確認できます。
システムの仕様で「年/月/日/数字」のプレフィックスが付与されているので順にクリックしていきます。

クリックしていくとオブジェクトが作成されていました。
これで先ほど作成したログがS3に送信されていることが確認できました。

以上でマネジメントコンソールを使ったCloudWatch LogsからKinesis DataFirehoseを使ったS3への送信のシステムの作成ハンズオンは終了です。
学習が終わったら作成したリソースの削除は忘れないように気をつけて下さい。