AWS CloudWatch Logs のログデータを Amazon Kinesis Data Firehose を使用してS3に自動で保存する

木原です。
AWSでシステムを構築する上で、システムを正しく運用するために必須なのが、CloudWatchLogsです。
しかし、一定期間で消えてしまうので、後々の監査などで困ってしまいますので自動的にS3に保存する

目次

ステップ1:S3バケットの作成

AWS CLI でS3バケットを作成します。

aws s3api create-bucket --bucket my-bucket --create-bucket-configuration LocationConstraint=region

入力コード例

aws s3api create-bucket --bucket my-kinesis-exported-logs --create-bucket-configuration LocationConstraint=ap-northeast-1 --profile user

出力結果

ステップ2:Amazon S3 バケットにデータを置く権限を Amazon Kinesis Data Firehose に付与する IAM ロールを作成します。

~/TrustPolicyForFirehose.json で信頼ポリシーを作成します。account-id は、AWS アカウント ID で置き換えます。

touchTrustPolicyForFirehose.json
viTrustPolicyForFirehose.json
{
  "Statement": {
    "Effect": "Allow",
    "Principal": { "Service": "firehose.amazonaws.com" },
    "Action": "sts:AssumeRole",
    "Condition": { "StringEquals": { "sts:ExternalId":"account-id" } }
  }
}

ステップ3:create-role コマンドを使用し、信頼ポリシーファイルを指定して IAM ロールを作成します。 

file://~/TrustPolicyForFirehose.json は、TrustPolicyForFirehose.jsonファイルがあるパス指定をします。

aws iam create-role \
      --role-name FirehosetoS3Role \
      --assume-role-policy-document file://~/TrustPolicyForFirehose.json

後のステップで必要になるため、返された Role.Arn 値を書き留めます。

{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Statement": {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                    "Service": "firehose.amazonaws.com"
                }
            }
        },
        "RoleId": "AAOIIAH450GAB4HC5F431",
        "CreateDate": "2015-05-29T13:46:29.431Z",
        "RoleName": "FirehosetoS3Role",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:role/FirehosetoS3Role"
    }
}

ステップ4:権限ポリシーを作成し、Kinesis Data Firehose がアカウントで実行できるアクションを定義します。

まず、テキストエディタを使用してファイル ~/PermissionsForFirehose.json で権限ポリシーを作成します。

touch PermissionsForFirehose.json
vi PermissionsForFirehose.json

my-bucketをステップ1で作成したバケット名に変更してください。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [ 
          "s3:AbortMultipartUpload", 
          "s3:GetBucketLocation", 
          "s3:GetObject", 
          "s3:ListBucket", 
          "s3:ListBucketMultipartUploads", 
          "s3:PutObject" ],
      "Resource": [ 
          "arn:aws:s3:::my-bucket", 
          "arn:aws:s3:::my-bucket/*" ]
    }
  ]
}

ステップ5: put-role-policy コマンドを使用して、アクセス許可ポリシーをロールに関連付けます。

file://~/TrustPolicyForFirehose.json は、 PermissionsForFirehose.json ファイルがあるパス指定をします。

aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose --policy-document file://~/PermissionsForFirehose.json

ステップ6:次のように、送信先 Kinesis Data Firehose 送信ストリームを作成します。

RoleARN と BucketARN のプレースホルダー値を、作成したロールおよびバケット ARN に置き換えます。

aws firehose create-delivery-stream \
   --delivery-stream-name 'my-delivery-stream' \
   --s3-destination-configuration \
  '{"RoleARN": "arn:aws:iam::123456789012:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::my-bucket"}'

実行すると以下が返されます。

{
  “DeliveryStreamARN”: “arn:aws:firehose:ap-northeast-1:093456473079:deliverystream/my-delivery-stream”
}

Kinesis Data Firehose は、Amazon S3 オブジェクトに提供された YYYY/MM/DD/HH UTC 時間形式をプレフィックスで自動的に使用する点に注意してください。時間形式プレフィックスの前に、追加のプレフィックスを指定できます。プレフィックスの最後がフォワードスラッシュ (/) の場合は、Amazon S3 バケット内のフォルダとして表示されます。

ストリームがアクティブになるまで待ちます (これには数分かかる可能性があります)。

ステップ7:Kinesis Data Firehose describe-delivery-stream コマンドを使用して、DeliveryStreamDescription.DeliveryStreamStatus プロパティをチェックできます。

さらに、後のステップで必要になるため、DeliveryStreamDescription.DeliveryStreamARN 値を書き留めます。

aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream"
{
    "DeliveryStreamDescription": {
        "HasMoreDestinations": false,
        "VersionId": "1",
        "CreateTimestamp": 1446075815.822,
        "DeliveryStreamARN": "arn:aws:firehose:us-east-1:123456789012:deliverystream/my-delivery-stream",
        "DeliveryStreamStatus": "ACTIVE",
        "DeliveryStreamName": "my-delivery-stream",
        "Destinations": [
            {
                "DestinationId": "destinationId-000000000001",
                "S3DestinationDescription": {
                    "CompressionFormat": "UNCOMPRESSED",
                    "EncryptionConfiguration": {
                        "NoEncryptionConfig": "NoEncryption"
                    },
                    "RoleARN": "delivery-stream-role",
                    "BucketARN": "arn:aws:s3:::my-bucket",
                    "BufferingHints": {
                        "IntervalInSeconds": 300,
                        "SizeInMBs": 5
                    }
                }
            }
        ]
    }
}

ステップ8:Kinesis Data Firehose 送信ストリームにデータを置く権限を CloudWatch Logs に付与する IAM ロールを作成します。

まず、テキストエディタを使用してファイル ~/TrustPolicyForCWL.json で信頼ポリシーを作成します。

touch TrustPolicyForCWL.json
vi TrustPolicyForCWL.json
{
  "Statement": {
    "Effect": "Allow",
    "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" },
    "Action": "sts:AssumeRole"
  }
}

ステップ9:create-role コマンドを使用し、信頼ポリシーファイルを指定して IAM ロールを作成します。

後のステップで必要になるため、返された Role.Arn 値を書き留めます。

aws iam create-role \
      --role-name CWLtoKinesisFirehoseRole \
      --assume-role-policy-document file://~/TrustPolicyForCWL.json
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Statement": {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                    "Service": "logs.region.amazonaws.com"
                }
            }
        },
        "RoleId": "AAOIIAH450GAB4HC5F431",
        "CreateDate": "2015-05-29T13:46:29.431Z",
        "RoleName": "CWLtoKinesisFirehoseRole",
        "Path": "/",
        "Arn": "arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole"
    }
}

ステップ10:権限ポリシーを作成し、CloudWatch Logs がアカウントで実行できるアクションを定義します。

まず、テキストエディタを使用して権限ポリシーファイル (例: ~/PermissionsForCWL.json) を作成します。

touch PermissionsForCWL.json

vi PermissionsForCWL.json

{
    "Statement":[
      {
        "Effect":"Allow",
        "Action":["firehose:*"],
        "Resource":["arn:aws:firehose:region:123456789012:*"]
      }
    ]
}

ステップ11:put-role-policy コマンドを使用して、権限ポリシーをロールに関連付けます。

file://~/PermissionsForCWL.json は、 PermissionsForCWL.json ファイルがあるパス指定をします。

aws iam put-role-policy --role-name CWLtoKinesisFirehoseRole --policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL.json

ステップ12:CloudWatch Logs サブスクリプションフィルタを作成

Amazon Kinesis Data Firehose 送信ストリームがアクティブ状態になり、IAM ロールを作成したら、CloudWatch Logs サブスクリプションフィルタを作成できます。サブスクリプションフィルタにより、選択されたロググループから Amazon Kinesis Data Firehose 送信ストリームへのリアルタイムログデータの流れがすぐに開始されます。

–log-group-name
  –destination-arn
  –role-arn

は自分の環境に合わせてください。

aws logs put-subscription-filter \
    --log-group-name "CloudTrail" \
    --filter-name "Destination" \
    --filter-pattern "{$.userIdentity.type = Root}" \
    --destination-arn "arn:aws:firehose:region:123456789012:deliverystream/my-delivery-stream" \
    --role-arn "arn:aws:iam::123456789012:role/CWLtoKinesisFirehoseRole"

ステップ13:Amazon S3 バケットをチェックしてデータを確認

サブスクリプションフィルタを設定したら、CloudWatch Logs によりフィルタパターンに一致するすべての受信ログイベントが Amazon Kinesis Data Firehose 送信ストリームに転送されます。Amazon Kinesis Data Firehose 配信ストリームに設定された時間バッファ間隔に基づいて、Amazon S3 にデータが表示されるようになります。十分な時間が経過すると、Amazon S3 バケットをチェックしてデータを確認できます。

aws s3api list-objects --bucket 'my-bucket' --prefix 'firehose/'
{
    "Contents": [
        {
            "LastModified": "2015-10-29T00:01:25.000Z",
            "ETag": "\"a14589f8897f4089d3264d9e2d1f1610\"",
            "StorageClass": "STANDARD",
            "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-01-21-a188030a-62d2-49e6-b7c2-b11f1a7ba250",
            "Owner": {
                "DisplayName": "cloudwatch-logs",
                "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b5"
            },
            "Size": 593
        },
        {
            "LastModified": "2015-10-29T00:35:41.000Z",
            "ETag": "\"a7035b65872bb2161388ffb63dd1aec5\"",
            "StorageClass": "STANDARD",
            "Key": "firehose/2015/10/29/00/my-delivery-stream-2015-10-29-00-35-40-7cc92023-7e66-49bc-9fd4-fc9819cc8ed3",
            "Owner": {
                "DisplayName": "cloudwatch-logs",
                "ID": "1ec9cf700ef6be062b19584e0b7d84ecc19237f87b6"
            },
            "Size": 5752
        }
    ]
}

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
目次
閉じる