
Amazon Bedrockのログ設定
前回は「Amazon Bedrockをアプリと繋げてみる ~ AWS環境の作成 ~」ということで、AWS上で動く環境を作成し、Bedrockからの回答を画面に反映するところまでをやってみました。
今回はログの出力についてやってみたいと思います。
構成図

ログの種類
Bedrockのログの出力先としては、S3、CloudWatch Logsの2種類があります。
S3は主にログの長期補完やデータレイクとして利用し、Athena、Redshift、QuickSightなどから利用するなどの用途になります。
CloudWatch Logsは、コンソール上ですぐにログが確認でき、簡易的にログの検索などができるCloudWatch Logs Insightsがあります。またコスト的にはS3よりは少し高くなるため、主に短期利用が適しているかなと思います。
今回は両方とも設定して確認してみます。
リソースの作成と設定
ログの設定は以下のドキュメントに記載があります。この情報を参考に今回は設定をしていきます。
ログ保管用のS3バケットの作成
ログを保管するS3バケットを作ります。ポイントになるのはバケットポリシーでBedrockからの書き込みを許可するという点になります。

作成時の設定は、デフォルトのままでログの出力は出来るため、今回はデフォルトのままで進めます。
Bedrockはリージョンサービスのため、リージョン毎にログの設定を行う点に注意です。バケットを分ける場合は、S3のバケット名が被らないように注意してください。または、Bedrockのログ設定で prefixは指定できるため、S3バケット内のprefixでリージョン毎に分けるのも良いかと思います。

バケットが作成できたら、詳細画面に入りアクセス許可タブで、バケットポリシーを設定します。

以下のポリシーのResourceとConditionの bucketName, prefix, accountId, region の部分を書き換えて設定します。AWSのドキュメントの方が、対象箇所が赤字で表示されているので分かりやすいです。
bucketName: 作成したバケットの名前
prefix: Bedrock側の設定と合わせる、不要であれば削除
accountId: ログを記録したいBedrockが動作しているアカウントID
region: ログを記録したいBedrockが動作しているリージョン
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AmazonBedrockLogsWrite",
"Effect": "Allow",
"Principal": {
"Service": "bedrock.amazonaws.com"
},
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::{bucketName}/{prefix}/AWSLogs/{accountId}/BedrockModelInvocationLogs/*"
],
"Condition": {
"StringEquals": {
"aws:SourceAccount": "{accountId}"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:bedrock:{region}:{accountId}:*"
}
}
}
]
}
変更の保存ボタンをクリックして保存を行います。

以上で、S3バケットの作成は完了です。
ログ保管用のCloudWatch Logsのロググループの作成
ログを保管するCloudWatch Logsのロググループを作成します。権限などの設定はBedrockに付与するIAMロールとポリシーで設定するため、ポイントになる設定はありません。
なおロググループは、サービスによっては自動で作成してくれるものもありますが、Bedrockは現時点(2024/01/23)では作成しておく必要があります。

設定はデフォルトのままで問題ないため、今回はデフォルトの設定で進めます。

以上で、CloudWatch Logsのロググループの作成は完了です。
Bedrockのログ送信用のIAMポリシーの作成
Bedrockに付与するIAMロールのポリシーを作成します。
ポイントとしては、S3はバケットポリシーで制御しているため、CloudWatch Logsのロググループへの書き込みを行うためのアクションとリソースを設定することです。

以下のポリシーのregion, accountId, logGroupNameの部分を書き換えて設定します。AWSのドキュメントの方が対象箇所が赤字で表示されているので分かりやすいです。
region: ログを記録したいBedrockが動作しているリージョン
accountId: ログを記録したいBedrockが動作しているアカウントID
logGroupName: 作成したロググループの名前
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:{region}:{accountId}:log-group:{logGroupName}:log-stream:aws/bedrock/modelinvocations"
}
]
}
次へボタンをクリックして、次の画面でポリシー名を設定し、内容を確認して誤りがなければポリシーを作成します。

Bedrockのログ送信用のIAMロールの作成
Bedrockに付与するロールを作成します。
ポイントとしては、IAMロールは自アカウントのBedrockだけが、このロールを利用できるように設定する点です。

次の画面で、カスタム信頼ポリシーを選択し、以下のポリシーのregion, accountIdの部分を書き換えて設定します。AWSのドキュメントの方が対象箇所が赤字で表示されているので分かりやすいです。
accountId: ログを記録したいBedrockが動作しているアカウントID
region: ログを記録したいBedrockが動作しているリージョン
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "bedrock.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "{accountId}"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:bedrock:{region}:{accountId}:*"
}
}
}
]
}
次へボタンをクリックします

許可ポリシーに、先ほど作成したポリシーを設定して次へボタンをクリックします。

次の画面ではロール名を設定して、内容を確認して誤りがなければロールを作成します。
Bedrockのログ設定
最後にBedrockのログ設定を行います。今まで作成したS3やCloudWatch Logsのロググループを設定します。
Bedrockのコンソール画面で setting 画面に行き Model invocation logging をONにします。

Select the logging destinationsは、Both S3 and Cloudwatch Logs を選択、以下の項目を設定し、Save settingsボタンをクリックして保存します。
Select the data types to include with logs: 全て選択
S3 location: 作成したログ保管用のS3バケットのARN(モーダルで選択)
Log group name: 作成したログ保管用のロググループ名
Choose a method to authorize Bedrock
Use an existing service roleを選択
Service role: 作成したIAMロールのARN

以上で、Bedrockのログ設定は完了です。
ログの確認
ログの送信を確認するため、Bedrockのコンソールから利用できるPlaygroundsを利用してみます。Chat画面に入り、Select modelボタンをクリックします。

Category、Model、Throughputを選択して、Applyボタンをクリックします。

表示された画面の下部に聞きたいことを入力して、Runボタンをクリックします。右側にあるConfigurationは変えなくても問題ありませんが、Lengthについては、1回あたりの回答のトークン数となるため、少し多めにしておくと良いかと思います。


S3ログの確認
作成したログ保管用のS3バケットを見ると、ログが送信されているので、ダウンロードをして確認します。なお送信されるまでに少し時間がかかる場合があります。

先ほどBedrockで質問した内容などが出力されていることが確認できました。

CloudWatch Logsのログの確認
作成したログ保管用のCloudWatch Logsのログループを見ると、ログが送信されていることが確認できました。なお送信されるまでに少し時間がかかる場合があります。


まとめ
今回はBedrockのログ出力ということで、ログの設定をしてみました。
どういった入力をBedrockが受け取り、どういった出力をしたのかが分かるため、色々と利用が出来そうなデータが取れそうですね。またトークン数も載っているため、どのぐらいのコストになりそうか?といった観点でも参考情報になりそうです。