如何跨账户将 CloudWatch 日志推送到 Kinesis Data Firehose?

4 分钟阅读
0

我想将 Amazon CloudWatch 日志从 Amazon Kinesis Data Firehose 流式传输到不同 AWS 区域的另一个账户。

简短描述

要将 CloudWatch 日志发送到其他区域的 Data Firehose 流,该区域必须支持 Kinesis Data Firehose。确认您所在的区域是否支持 Kinesis Data Firehose

要使用 Kinesis Data Firehose 在其他账户和支持的区域中流式传输日志,请完成以下步骤:

  1. 在目标账户中创建 Amazon Simple Storage Service(Amazon S3)桶。创建一个 AWS Identity and Access Management(IAM)角色。然后,附加 Kinesis Data Firehose 所需的权限,以将数据推送到 Amazon S3。
  2. 在目标账户中为 Kinesis Data Firehose 创建一个目的地。为 CloudWatch Logs 创建 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.    创建 IAM 角色和向 Kinesis Data Firehose 授予所需权限的信任策略:

{
  "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 时,时间戳命名空间表达式中会使用一个自定义前缀。您可以在时间格式前缀(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.    创建 IAM 角色和向 CloudWatch Logs 授予将数据放入 Kinesis Data Firehose 流的权限的信任策略。确保添加日志被推送到的区域:

{
  "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 日志组发送数据的权限的信任策略:

{
  "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 流日志可以在源账户中执行的操作:

{
  "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 桶,以确认已发布日志。

相关信息

DeliveryStreamDescription

AWS 官方
AWS 官方已更新 1 年前