Kinesis Agent を使用してログを Kinesis にプッシュするときに Amazon EC2 メタデータを追加する方法を教えてください。

最終更新日: 2020 年 5 月 12 日

Amazon Kinesis Agent を使用して Amazon Elastic Compute Cloud (Amazon EC2) から Amazon Kinesis にログを送信しようとしています。Amazon EC2 メタデータを各ログ行に追加する方法を教えてください。

簡単な説明

以下の操作を行うことで、各ログ行に EC2 メタデータを追加できます。

1.    Linux または Windows プラットフォームに Kinesis Agent をインストールして設定します。

2.    EC2 メタデータを表示するように構成設定を更新します。

3.    必要な AWS Identity and Access Management (IAM) アクセス許可があることを確認します。

注意: EC2 メタデータを取得し、Amazon Kinesis Data Firehose にデータを発行するには、IAM アクセス許可が必要です。

解決方法

Linux プラットフォームの場合

Kinesis Agent を使用して Kinesis Data Firehose にログを送信するには、以下の手順を実行します。

1.    エージェントをダウンロードしてインストールします。

2.    以下のアクセス許可を持つ IAM ロールを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "firehose:PutRecord",
        "firehose:PutRecordBatch"
      ],
      "Resource": [
        "<KFH ARN>"
      ]
    },
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeInstanceAttribute",
        "ec2:DescribeInstanceTypes",
        "ec2:DescribeInstanceStatus"
      ],
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "cloudwatch:PutMetricData",
      "Resource": "*"
    }
  ]
}

3.    Kinesis Agent をインストールした EC2 インスタンスに新しく作成した IAM ロールを添付します。既存の IAM ロール割り当ての詳細については、既存の IAM ロールを EC2 インスタンスに割り当てる方法を教えてくださいを参照してください。

4.    /etc/aws-kinesis/agent.json ファイルを編集します。

{
  "cloudwatch.emitMetrics": true,
  "kinesis.endpoint": "",
  "firehose.endpoint": "firehose.us-east-1.amazonaws.com",
  
  "flows": [
    {
      "filePattern": "/tmp/app.log*",
      "deliveryStream": "yourdeliverystream",
      "partitionKeyOption": "RANDOM",
      "dataProcessingOptions": [
	      {
                    "optionName": "LOGTOJSON",
                    "logFormat": "COMMONAPACHELOG"
              },
	      {
	        "optionName": "ADDEC2METADATA",
		"logFormat": "COMMONAPACHELOG"
	      }
      ]
    }
  ]
}

この例では、/etc/aws-kinesis/agent.json ファイルは COMMONAPACHELOG ログファイル形式を処理します。ログファイルの形式が異なる場合は、dataProcessingOptions 設定をログファイル形式に更新する必要があります。エージェントと処理オプションの詳細については、 エージェントを使用してデータを事前処理するを参照してください。

重要: optionName フィールドに ADDEC2METADATA を追加して、EC2 メタデータが各ログ行に追加されるようにします。デフォルトでは、Kinesis Agent は EC2 メタデータに複数のパラメータ (privateIpavailabilityZoneinstanceIdinstanceTypeaccountIdamiIdregion、および metadataTimestamp) を追加します。

5.    エージェントを設定して起動します。エージェントはバックグラウンドでシステムサービスとして実行されるようになりました。指定されたファイルを継続的にモニタリングし、指定された配信ストリームにデータを送信します。エージェントアクティビティは、次の出力例のように /var/log/aws-kinesis-agent/aws-kinesis-agent.log ファイルに記録されます。

{
        "host": "157.92.12.106",
        "ident": null,
        "authuser": null,
        "datetime": "31/Aug/1995:20:50:31 -0400",
        "request": "GET /history/astp/astp-spacecraft.txt HTTP/1.0",
        "response": "200",
        "bytes": "440",
        "privateIp": "X.X.X.X",
        "availabilityZone": "us-east-1c",
        "instanceId": "i-01bxxxxxxxxxx43a0",
        "instanceType": "t2.xlarge",
        "accountId": "585xxxxxx740",
        "amiId": "ami-0fc61db8544a617ed",
        "region": "us-east-1",
        "metadataTimestamp": "2020-04-20T02:28:40+0000"
    }

Windows プラットフォームの場合

Amazon Kinesis Tap Agent を使用して Data Firehose にデータを送信するには、以下の手順を実行します。

1.    Windows 向け Kinesis Agent をインストールします。

2.    以下のアクセス許可を持つ IAM ロールを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "firehose:DeleteDeliveryStream",
        "firehose:PutRecord",
        "firehose:PutRecordBatch",
        "firehose:UpdateDestination"
      ],
      "Resource": [
        "<KFH ARN>"
      ]
    },
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeInstanceAttribute",
        "ec2:DescribeInstanceTypes",
        "ec2:DescribeInstanceStatus"
      ],
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "cloudwatch:PutMetricData",
      "Resource": "*"
    }
  ]
}

3.    Kinesis Tap Agent をインストールした EC2 インスタンスに新しく作成した IAM ロールを添付します。

4.    C:\Program Files\Amazon\AWSKinesisTap\appsettings.json ファイルを開きます。

{
    "Sources": [
        {
            "Id": "W3SVCLog1",
            "SourceType": "W3SVCLogSource",
            "Directory": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
            "FileNameFilter": "*.log",
            "TimeZoneKind": "UTC"
        }
    ],
    "Sinks": [
        {
            "Id": "W3SVCLogSink",
            "SinkType": "KinesisFirehose",
            "Region": "eu-central-1",
            "StreamName": " W3SVCLogStream",
	"Format": "json",
	"ObjectDecoration": "instance_id={instance_id};hostname={hostname};ec2:local-hostname={ec2:local-hostname};computername={computername};env:computername={env:computername};timestamp:yyyyMMdd={timestamp:yyyyMMdd}"
        }		
	
    ],
    "Pipes": [
        {
            "Id": "W3SVCLog1ToKinesisStream",
            "SourceRef": "W3SVCLog1",
            "SinkRef": "W3SVCLogSink"
        }
    ]
}

重要: "ObjectDecoration": "instance_id={instance_id};hostname={hostname};ec2:local-hostname={ec2:local-hostname};computername={computername};env:computername={env:computername};timestamp:yyyyMMdd={timestamp:yyyyMMdd}" をシンクに追加して、EC2 メタデータが各ログ行に確実に追加されるようにします。Kinesis Tap Agent は、複数のパラメータ (instance_idhostnameec2:local-hostnamecomputernameenv:computername、および timestamp:yyyyMMdd) を EC2 メタデータとして追加します。これらのパラメータをすべて表示しない場合は、追加するパラメータを指定します。

設定オプションの詳細については、Microsoft Windows 向け Amazon Kinesis Agent の設定を参照してください。

5.    Windows 向け Kinesis Agent を設定して起動し、Kinesis Tap Agent を開始します。次の出力が各ログ行に表示されます。

{
    "EventId": 7036,
    "Description": "The WinHTTP Web Proxy Auto-Discovery Service service entered the stopped state.",
    "LevelDisplayName": "Informational",
    "LogName": "System",
    "MachineName": "EC2AMAZ-GLL60A7",
    "ProviderName": "Service Control Manager",
    "TimeCreated": "2020-04-20T06:02:51.5847181Z",
    "Index": 34427,
    "UserName": null,
    "Keywords": "Classic",
    "instance_id": "i-0183xxxxxxxxxx4b7",
    "hostname": "ip-x-x-x-x.ec2.internal",
    "ec2:local-hostname": "ip-x-x-x-x.ec2.internal",
    "computername": "EC2AMAZ-GLL60A7",
    "env:computername": "EC2AMAZ-GLL60A7",
    "timestamp:yyyyMMdd": "20200420"
}