FireLens(Fluent Bit)からCloudWatch Logsのログ保持期間を設定したがタスクロールの権限不足により失敗したときの対応方法

2021.11.14

Fluent BitのCloudWatch Logsプラグインを利用し、Fluent BitからCloudWatch Logsのロググループ、ログストリームを作成していました。CloudWatch Logsのログ保持期限もFluent Bitの設定ファイルから指定できます。だけど、タスクロールの権限不足で失敗したときのエラーと対応内容を紹介します。

Fluent Bitコンテナのログより、エラーメッセージ

PutRetentionPolicy API responded with error='AccessDeniedException'

原因と対応結果

  • タスクロールに必要なポリシーlog:PutRetentionPolicyが足りていない
  • タスクロールへ権限追加後、新規のFluent Bitコンテナ起動でログ保持期限の設定追加に成功した

状況確認

FireLensはアプリケーションコンテナに対してログルーティング機能を提供するFluent Bitまたは、Fluentdを起動できます。サイドカーパターンで起動します。 FireLensによりログルーティングを行うFluent Bitコンテナを準備しました。以下はFluent BitのDockerfileと、設定ファイルの内容です。

項目 バージョン
aws-for-fluent-bit 2.21.1
Fluent Bit 1.8.9
Fargate platform 1.4.0

Dockerfile

FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:2.21.1
COPY ./extra.conf /fluent-bit/etc/extra.conf

ロググループの自動作成と、ログ保持期限を30日を指定しました。

extra.conf

[SERVICE]
    Flush 1
    Grace 30

[OUTPUT]
    Name cloudwatch_logs
    Match  *-firelens-*
    region ap-northeast-1
    log_group_name /sample5-dev-web-error-logs
    log_stream_prefix fluentbit-
    auto_create_group true
    log_retention_days 30

FargateでFireLensを含むタスクを起動します。Fluent Bitコンテナ起動によりロググループが新規作成されました。しかし、retentionInDaysの項目がなく保持期限30日設定されていません。

Fluent Bit作成のロググループ情報

$ aws logs describe-log-groups --log-group-name-prefix /sample5-dev-web-error-logs --outpu table
-------------------------------------------------------------------------------------------------------------
|                                             DescribeLogGroups                                             |
+-----------------------------------------------------------------------------------------------------------+
||                                                logGroups                                                ||
|+-------------------+-------------------------------------------------------------------------------------+|
||  arn              |  arn:aws:logs:ap-northeast-1:123456789012:log-group:/sample5-dev-web-error-logs:*   ||
||  creationTime     |  1636805554034                                                                      ||
||  logGroupName     |  /sample5-dev-web-error-logs                                                        ||
||  metricFilterCount|  0                                                                                  ||
||  storedBytes      |  0                                                                                  ||
|+-------------------+-------------------------------------------------------------------------------------+|

Fluent Bitのログ確認

Fluent Bitではアプリケーションコンテナのログをルーティングします。Fluent Bitコンテナ自体のログをCloudWatch Logsに保存できます。CloudWatch LogsからFluent Bitのログを確認すると以下のエラーを確認できました。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                             message                                                                                              |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
...snip...
| 1636805554058 | [2021/11/13 12:12:34] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Setting retention policy on log group /sample5-dev-web-error-logs to 30d                                                |
| 1636805554064 | [2021/11/13 12:12:34] [error] [aws_client] auth error, refreshing creds                                                                                                                          |
| 1636805554064 | [2021/11/13 12:12:34] [error] [aws_credentials] Shared credentials file /root/.aws/credentials does not exist                                                                                    |
| 1636805554064 | [2021/11/13 12:12:34] [error] [output:cloudwatch_logs:cloudwatch_logs.0] PutRetentionPolicy API responded with error='AccessDeniedException'                                                     |
| 1636805554064 | [2021/11/13 12:12:34] [error] [output:cloudwatch_logs:cloudwatch_logs.0] Failed to putRetentionPolicy                                                                                            |
...snip...
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PutRetentionPolicyAccessDeniedExceptionとなっています。つまり、ログ保持期限を設定する権限が不足しています。ここで必要な権限はタスク実行ロールではなくタスクロールの方です。

タスクロールの権限確認

タスクロールにアタッチしているIAMポリシーを確認します。SentCloudWatchLogsPolicyという名前のポリシーを設定していました。

$ aws iam list-attached-role-policies --role-name sample5-dev-web-ECSTaskRole --output table
-------------------------------------------------------------------------------------------------------------------------------
|                                                  ListAttachedRolePolicies                                                   |
+-----------------------------------------------------------------------------------------------------------------------------+
||                                                     AttachedPolicies                                                      ||
|+-----------------------------------------------------------------------------+---------------------------------------------+|
||                                  PolicyArn                                  |                 PolicyName                  ||
|+-----------------------------------------------------------------------------+---------------------------------------------+|
||  arn:aws:iam::123456789012:policy/sample5-dev-ECSExecPolicy                 |  sample5-dev-ECSExecPolicy                  ||
||  arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy      |  sample5-dev-SentCloudWatchLogsPolicy       ||
||  arn:aws:iam::123456789012:policy/sample5-dev-SentKinesisDataFirehosePolicy |  sample5-dev-SentKinesisDataFirehosePolicy  ||
|+-----------------------------------------------------------------------------+---------------------------------------------+|

先にDefaultVersionIdを確認します。次のコマンドの引数に--version-idで指定が必要なためです。

$ aws iam get-policy --policy-arn arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy
{
    "Policy": {
        "PolicyName": "sample5-dev-SentCloudWatchLogsPolicy",
        "PolicyId": "ANPAQ4BT4DHFKO4OTAK4J",
        "Arn": "arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 1,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2021-11-06T07:58:58+00:00",
        "UpdateDate": "2021-11-06T07:58:58+00:00",
        "Tags": []
    }
}

PutRetentionPolicyがありませんでした。 Fluent Bitのエラーメッセージ通り権限不足ですね。

$ aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy --version-id v1
{
    "PolicyVersion": {
        "Document": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        "logs:CreateLogStream",
                        "logs:CreateLogGroup",
                        "logs:DescribeLogStreams",
                        "logs:PutLogEvents"
                    ],
                    "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:*",
                    "Effect": "Allow"
                }
            ]
        },
        "VersionId": "v1",
        "IsDefaultVersion": true,
        "CreateDate": "2021-11-06T07:58:58+00:00"
    }
}

対応

必要なIAMポリシー追加しました。logs:PutRetentionPolicyが追加されています。IAMポリシーを追加したためバージョンが繰り上がっています。IAMポリシーを確認するときの引数--vesion-idも変更必要です。

$ aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/sample5-dev-SentCloudWatchLogsPolicy --version-id v2
{
    "PolicyVersion": {
        "Document": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": [
                        "logs:CreateLogStream",
                        "logs:CreateLogGroup",
                        "logs:DescribeLogStreams",
                        "logs:PutLogEvents",
                        "logs:PutRetentionPolicy"
                    ],
                    "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:*",
                    "Effect": "Allow"
                }
            ]
        },
        "VersionId": "v2",
        "IsDefaultVersion": true,
        "CreateDate": "2021-11-13T13:25:27+00:00"
    }
}

Fluent BitのログからはFluent Bitが起動時にCloudWatch Logs設定をしているようにみえるため、タスク強制デプロイし新しいFluent Bitコンテナを起動させました。 Fluent Bitのログを確認します。今度はSet retention policy to 30のメッセージを確認でき成功しています。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                             message                                                                                              |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
...snip...
| 1636810542604 | [2021/11/13 13:35:42] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Setting retention policy on log group /sample5-dev-web-error-logs to 30d                                                |
| 1636810542649 | [2021/11/13 13:35:42] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Set retention policy to 30                                                                                              |
...snip...
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudWatch Logsの設定も確認します。30日設定が入りました。

$ aws logs describe-log-groups --log-group-name-prefix /sample5-dev-web-error-logs --outpu table
-------------------------------------------------------------------------------------------------------------
|                                             DescribeLogGroups                                             |
+-----------------------------------------------------------------------------------------------------------+
||                                                logGroups                                                ||
|+-------------------+-------------------------------------------------------------------------------------+|
||  arn              |  arn:aws:logs:ap-northeast-1:123456789012:log-group:/sample5-dev-web-error-logs:*   ||
||  creationTime     |  1636805554034                                                                      ||
||  logGroupName     |  /sample5-dev-web-error-logs                                                        ||
||  metricFilterCount|  0                                                                                  ||
||  retentionInDays  |  30                                                                                 ||
||  storedBytes      |  0                                                                                  ||
|+-------------------+-------------------------------------------------------------------------------------+|

これでFluent Bitの設定通りの設定をロググループに設定できました。

まとめ

タスクロールの権限不足でログ期限設定に失敗しても、後からタスクロールに権限を追加し新たにFluent Bitコンテナを起動させれば、ロググループに設定追加(変更)できることがわかりました。既存のロググループを一度削除してから、再度Fluent Bitからロググループ自動生成し直しは必要ありませんでした。

おわりに

Flunet Bitの設定ファイルを編集後に起動したFluent Bitコンテナのログは必ずチェックしておいた方がよいという自戒でした。Fluent Bit起動時にまず設定ミスでエラーがないかログを見ておくと安心です。以下はエラーなく起動してきたFluent Bit v1.8.9の起動ログです。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   timestamp   |                                                                                             message                                                                                              |
|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1636810552223 | Fluent Bit v1.8.9                                                                                                                                                                        |
| 1636810552223 | * Copyright (C) 2019-2021 The Fluent Bit Authors                                                                                                                                    |
| 1636810552223 | * Copyright (C) 2015-2018 Treasure Data                                                                                                                                             |
| 1636810552223 | * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd                                                                                                                                 |
| 1636810552223 | * https://fluentbit.io                                                                                                                                                                           |
| 1636810552223 | [2021/11/13 13:35:52] [ info] [engine] started (pid=1)                                                                                                                                           |
| 1636810552223 | [2021/11/13 13:35:52] [ info] [storage] version=1.1.5, initializing...                                                                                                                           |
| 1636810552224 | [2021/11/13 13:35:52] [ info] [storage] in-memory                                                                                                                                                |
| 1636810552224 | [2021/11/13 13:35:52] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128                                                                                        |
| 1636810552224 | [2021/11/13 13:35:52] [ info] [cmetrics] version=0.2.2                                                                                                                                           |
| 1636810552224 | [2021/11/13 13:35:52] [ info] [input:tcp:tcp.0] listening on 127.0.0.1:8877                                                                                                                      |
| 1636810552224 | [2021/11/13 13:35:52] [ info] [input:forward:forward.1] listening on unix:///var/run/fluent.sock                                                                                                 |
| 1636810552224 | [2021/11/13 13:35:52] [ info] [input:forward:forward.2] listening on 127.0.0.1:24224                                                                                                             |
| 1636810552414 | [2021/11/13 13:35:52] [ info] [sp] stream processor started                                                                                                                                      |
| 1636810981807 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Creating log group /sample5-dev-web-error-logs                                                                          |
| 1636810981847 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Log Group /sample5-dev-web-error-logs already exists                                                                    |
| 1636810981847 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Setting retention policy on log group /sample5-dev-web-error-logs to 30d                                                |
| 1636810981900 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Set retention policy to 30                                                                                              |
| 1636810981900 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Creating log stream fluentbit-error-a9c2f644a3c749b095a07dfe9b15e10c-265927825 in log group /sample5-dev-web-error-logs |
| 1636810981928 | [2021/11/13 13:43:01] [ info] [output:cloudwatch_logs:cloudwatch_logs.0] Created log stream fluentbit-error-a9c2f644a3c749b095a07dfe9b15e10c-265927825                                           |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ちなみにFluent BitのログはログドライバーawslogsでCloudWatch Logsへ送らています。ログルーティングするFluent Bit(FireLens)で自分自信のログをルーティングしたらトラブル時にデバッグできないですからね。

参考