如何跨账户将 Amazon CloudWatch Logs 推送到 Kinesis Data Firehose?

上次更新日期:2022 年 1 月 19 日

我想将 Amazon Kinesis Data Firehose 中的 Amazon CloudWatch Logs 流式传输到不同区域中的另一个账户。如何设置从 Kinesis Data Firehose 到另一个区域中的 Amazon Simple Storage Service (Amazon S3) 存储桶的跨账户流?

简短描述

如果 AWS 区域不支持 Kinesis Data Firehose,则将 Amazon CloudWatch Logs 发送到其他 AWS 区域中的 Kinesis Data Firehose 流将会失败。

重要提示:确保您所在的区域支持 Kinesis Data Firehose

要在受支持的区域中使用 Kinesis Data Firehose 建立跨账户和跨区域流式处理,请执行以下步骤:

1.    在目标账户中创建 Amazon S3 存储桶。创建 AWS Identity and Access Management (IAM) 角色。然后,附加 Kinesis Data Firehose 所需的权限,以便将数据推送到 S3。

2.    在目标帐户中为 Kinesis Data Firehose 创建目标。为 Amazon CloudWatch Logs 服务创建 IAM 角色,以推送数据到 Kinesis Data Firehose 服务。然后,创建一个要将日志推送到的目标交付流。

3.    启用 VPC 流日志并将日志推送到源账户的 Amazon CloudWatch。

4.    在源账户中创建指向目标账户的订阅筛选器

5.    验证目标账户的 Amazon S3 存储桶中的日志事件流

解决方法

注意:本文使用以下示例值:

  • 目标账户:111111111111
  • Kinesis Data Firehose 区域:us-east-1
  • S3 存储桶区域:us-west-2
  • 目标区域(从源账户接收日志):us-east-2
  • 源账户:222222222222
  • Amazon CloudWatch 日志组区域:us-east2
  • VPC 流日志区域:us-east-2

设置目标账户

1.    创建 Amazon S3 存储桶:

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

location constraint(位置约束)指示存储桶将在 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 将数据放入您创建的 Amazon S3 存储桶。然后,将“111111111111”替换为您的 AWS 账户 ID。

3.    创建 IAM 角色并指定信任策略文件:

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

注意:,在后续步骤中,您将使用 Role_Arn 值。

4.    在 JSON 文件中创建权限策略,以定义 Kinesis Data Firehose 可以在目标账户中执行的操作:

{
  "Statement": [
    {
      "Effect":
    "Allow",
      "Action": [ 
          "s3:AbortMultipartUpload", 
          "s3:GetBucketLocation", 
          "s3:GetObject", 
          "s3:ListBucket", 
          "s3:ListBucketMultipartUploads", 
          "s3:PutObjectAcl",
          "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

将“RoleARN”和“BucketARN”替换为您创建的角色和存储桶 Amazon 资源名称 (ARN)。

注意:当 Amazon S3 对象成功传送到 Kinesis Data Firehose 时,将在 timestamp(时间戳)命名空间表达式中使用 custom prefix(自定义前缀)。您可以在时间格式前缀 (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 流所需的权限。确保添加要将日志推送到的区域:

{
  "Statement": {
    "Effect": "Allow",
    "Principal": {
  "Service": [
    "logs.us-east-1.amazonaws.com",
    "logs.us-east-2.amazonaws.com"
    
  ]
},
    "Action": "sts:AssumeRole"
  }
}

9.    使用 create-role 命令创建 IAM 角色并指定信任策略文件:

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

注意:在随后的步骤中,您将使用返回的 Role_Arn 值。

10.    创建权限策略以定义 CloudWatch Logs 可以在目标账户中执行哪些操作:

{
    "Statement":[
      {
        "Effect":"Allow",
        "Action":["firehose:*"],
       
    "Resource":["arn:aws:firehose:us-east-1:111111111111:*"]
      },
      {
        "Effect":"Allow",
        "Action":["iam:PassRole"],
       
    "Resource":["arn:aws:iam::111111111111:role/CWLtoKinesisFirehoseRole"]
      }
    ]
}

使用从第 7 步获得的 DeliveryStreamDescription.DeliveryStreamARN 值和从第 9 步获得的 Role_Arn 值。

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.    为 Amazon 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"
}
]
}

将“222222222222”替换为您创建的 Amazon Virtual Private Cloud (Amazon VPC) 日志所在的 AWS 源账户。

14.    关联访问策略与 Amazon 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

注意:在随后的步骤中,您将使用返回的要传递到 VPC 流日志的 ARN 值。

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.    创建一个用于为 VPC 流日志配置目标的 CloudWatch Logs 日志组:

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 Logs 日志组订阅 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-1:111111111111:destination:myDestination" --region us-east-2

更新 --destination ARN 值,并将“111111111111”替换为目标账号。

8.    检查 Amazon S3 存储桶以确认日志已发布。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?