CloudWatch ログを複数のアカウントで Kinesis Data Firehose にプッシュする方法を教えてください。

所要時間4分
0

Amazon Kinesis Data Firehose から Amazon CloudWatch Logs を別の AWS リージョンの別のアカウントにストリーミングしたいと考えています。

簡単な説明

CloudWatch ログ を別のリージョンの Kinesis Data Firehose ストリームに送信するには、そのリージョンが Kinesis Data Firehose をサポートしている必要があります。お住まいの地域が Kinesis Data Firehose をサポートしていることを確認してください。

Kinesis Data Firehose を使用して他のアカウントやサポートされているリージョンのログをストリーミングするには、次の手順を実行します。

  1. 宛先アカウントに Amazon Simple Storage Service (Amazon S3) バケットを作成します。AWS ID およびアクセス管理 (IAM) ロールを作成します。次に、Kinesis Data Firehose が Amazon S3 にデータをプッシュするために必要なアクセス権限を付与します。
  2. 宛先アカウントに Kinesis Data Firehose の宛先を作成します。CloudWatch ログ用の IAM ロールを作成して Kinesis Data Firehose にデータをプッシュします。次に、ログをプッシュする宛先配信ストリームを作成します。
  3. Amazon Virtual Private Cloud (Amazon VPC) フローログを有効にし、ログをソースアカウントの CloudWatch にプッシュします。
  4.  ソースアカウントに、宛先アカウントを指すサブスクリプションフィルターを作成します
  5. 宛先アカウントの S3バケットのログイベントのフローを検証します

解決方法

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

この解決方法では、以下のサンプル値を使用するため、独自の値に置き換える必要があります。

  • 宛先アカウント: 111111111111
  • Kinesis Data Firehose のリージョン: us-east-1
  • S3 バケットのリージョン: us-west-2
  • 宛先リージョン (宛先アカウントからのログ受信): us-east-2
  • ソースアカウント (VPC フローログが保存されている場所): 222222222222
  • Amazon CloudWatch ロググループリージョン: us-east2
  • VPC フローログリージョン: us-east-2

宛先アカウントを設定する

1.    S3 バケットを作成します。

aws s3api create-bucket --bucket my-bucket --create-bucket-configuration LocationConstraint=us-west-2 --region us-west-2

[ロケーションの制約] は、バケットが us-west-2 リージョンに作成されることを示しています。

2.    Kinesis Data Firehose に必要な権限を付与する IAM ロールと信頼ポリシーを作成します。

{
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "Service": "firehose.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {
        "sts:ExternalId": "111111111111"
      }
    }
  }
}

権限設定では、Kinesis Data Firehose が作成したS3 バケットにデータを入れることを許可する必要があります。

3.    IAM ロールを作成し、信頼ポリシーファイルを指定します。

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

Role\ _Arn の値を書き留めておき、後のステップで使用します。

4.    JSON ファイルにアクセス権限ポリシーを作成して、Kinesis Data Firehose が宛先アカウントで実行できるアクションを定義します。

{
    "Version": "2012-10-17",
    "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.    アクセス権限ポリシーを IAM ロールに関連付けます。

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

6.    Kinesis Data Firehose の宛先配信ストリームを作成します。

aws firehose create-delivery-stream --delivery-stream-name 'my-delivery-stream' --s3-destination-configuration RoleARN='arn:aws:iam::111111111111:role/FirehosetoS3Role',BucketARN='arn:aws:s3:::my-bucket' --region us-east-1

RoleARNBucketARN を、作成したロールとバケット ARN に置き換えてください。

**注:**S3 オブジェクトを Kinesis Data Firehose に正常に配信すると、timestamp 名前空間表現にカスタムプレフィックスが使用されます。時間フォーマットのプレフィックスの前にプレフィックスを追加して指定できます (yyyy/MM/dd/HH/)。プレフィックスがフォワードスラッシュ (/) で終わる場合は、S3 バケットのフォルダとして表示されます。

7.    describe-delivery-stream コマンドを使用して[DeliveryStreamDescription.DeliveryStreamStatus] プロパティを確認してください。

aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream" --region us-east-1

ストリームがアクティブであることを確認するには、describe-delivery-stream コマンドの出力を確認します。

{
  "DeliveryStreamDescription": {
    "DeliveryStreamType": "DirectPut",
    "HasMoreDestinations": false,
    "DeliveryStreamEncryptionConfiguration": {
      "Status": "DISABLED"
    },
    "VersionId": "1",
    "CreateTimestamp": 1604484348.804,
    "DeliveryStreamARN": "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream",
    "DeliveryStreamStatus": "ACTIVE",
    "DeliveryStreamName": "my-delivery-stream",
    "Destinations": [
      {
        "DestinationId": "destinationId-000000000001",
        "ExtendedS3DestinationDescription": {
          "RoleARN": "arn:aws:iam::111111111111:role/FirehosetoS3Role2test",
          "BufferingHints": {
            "IntervalInSeconds": 300,
            "SizeInMBs": 5
          },
          "EncryptionConfiguration": {
            "NoEncryptionConfig": "NoEncryption"
          },
          "CompressionFormat": "UNCOMPRESSED",
          "S3BackupMode": "Disabled",
          "CloudWatchLoggingOptions": {
            "Enabled": false
          },
          "BucketARN": "arn:aws:s3:::my-bucket"
        },
        "S3DestinationDescription": {
          "RoleARN": "arn:aws:iam::111111111111:role/FirehosetoS3Role2test",
          "BufferingHints": {
            "IntervalInSeconds": 300,
            "SizeInMBs": 5
          },
          "EncryptionConfiguration": {
            "NoEncryptionConfig": "NoEncryption"
          },
          "CompressionFormat": "UNCOMPRESSED",
          "CloudWatchLoggingOptions": {
            "Enabled": false
          },
          "BucketARN": "arn:aws:s3:::my-bucket"
        }
      }
    ]
  }
}

DeliveryStreamDescription.DeliveryStreamARN の値は後のステップで使用する必要があります。

8.    Kinesis Data Firehose ストリームにデータを入力するアクセス権限を CloudWatch ログに付与する IAM ロールと信頼ポリシーを作成します。ログがプッシュされるリージョンを必ず追加してください:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "Service": "logs.us-east-1.amazonaws.com"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringLike": {
        "aws:SourceArn": [
          "arn:aws:logs:region:sourceAccountId:*",
          "arn:aws:logs:region:recipientAccountId:*"
        ]
      }
    }
  }
}

9.    IAM ロールを作成して信頼ポリシーファイルを指定するには、create-role コマンドを使用します。

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

返された Role\ _Arn の値を書き留めておき、後のステップで使用します。

10.    アクセス権限ポリシーを作成して、CloudWatch ログが宛先アカウントで実行できるアクションを定義します。前のステップで書き留めた DeliveryStreamDescription.DeliveryStreamStatus と ** Role\ _Arn** の値を使用してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "firehose:ListDeliveryStreams",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111111111111:role/CWLtoKinesisFirehoseRole"
        },
        {
            "Effect": "Allow",
            "Action": [
                "firehose:DescribeDeliveryStream"
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Resource": "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream"
        }
    ]
}

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

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

12.   put-destination API 呼び出しを使用して、宛先アカウントに宛先を作成します。これは、ソースアカウントがすべてのログを送信する宛先です。

aws logs put-destination --destination-name "myDestination" --target-arn "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream"
--role-arn "arn:aws:iam::111111111111:role/CWLtoKinesisFirehoseRole" --region us-east-2

**注:**Kinesis Data Firehose がサポートされているどのリージョンでも、配信ストリームの宛先を作成できます。宛先を作成するリージョンは、ログソースリージョンと同じである必要があります。

13.    CloudWatch の宛先のアクセスポリシーを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "222222222222"
      },
      "Action": "logs:PutSubscriptionFilter",
      "Resource": "arn:aws:logs:us-east-2:111111111111:destination:myDestination"
    }
  ]
}

14.    アクセスポリシーを CloudWatch の宛先に関連付けます。

aws logs put-destination-policy --destination-name "myDestination" --access-policy file://~/AccessPolicy.json --region us-east-2

15.    宛先を確認するには、次のコマンドを実行します。

aws logs describe-destinations --region us-east-2

ソースアカウントをセットアップする

**注:**ソースアカウントの IAM 管理者ユーザーまたはルートユーザーである必要があります。

1.    IAM ロールと信頼ポリシーを作成して、VPC フローログに CloudWatch Logs ロググループにデータを送信する権限を付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

2.    IAM ロールを作成し、作成した信頼ポリシーファイルを指定するには、以下のコマンドを使用します。

aws iam create-role --role-name PublishFlowLogs --assume-role-policy-document file://~/TrustPolicyForVPCFlowLogs.json

返された ARN 値を書き留めて、後のステップで VPC フローログに渡します。

3.    権限ポリシーを作成して、VPC Flow ログがソースアカウントで実行できるアクションを定義します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

4.    アクセス権限ポリシーを IAM ロールに関連付けるには、以下のコマンドを実行します。

aws iam put-role-policy --role-name PublishFlowLogs --policy-name Permissions-Policy-For-VPCFlowLogs --policy-document file://~/PermissionsForVPCFlowLogs.json

5.    CloudWatch ログ ロググループを作成して VPC フローログの宛先を設定します。

aws logs create-log-group --log-group-name vpc-flow-logs --region us-east-2

6.    VPC フローログを有効にするには、以下のコマンドを実行します。

aws ec2 create-flow-logs --resource-type VPC --resource-ids vpc-12345678 --traffic-type ALL --log-group-name vpc-flow-logs --deliver-logs-permission-arn arn:aws:iam::222222222222:role/PublishFlowLogs --region us-east-2

注:****--resource-ids--deliver-logs-permission-arn プレースホルダー値を VPC ID と VPC フローログロールに置き換えてください。

7.    CloudWatch ロググループを宛先アカウントの Kinesis Data Firehose にサブスクライブします。

aws logs put-subscription-filter --log-group-name "vpc-flow-logs" --filter-name "AllTraffic" --filter-pattern "" --destination-arn
"arn:aws:logs:us-east-2:111111111111:destination:myDestination" --region us-east-2

--destination ARN 値を更新し、111111111111を宛先アカウント番号に置き換えます。

8.    S3 バケットをチェックして、ログが公開されていることを確認します。

関連情報

配信ストリームの説明

AWS公式
AWS公式更新しました 1年前