步骤 2:创建目标 - Amazon CloudWatch 日志

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

步骤 2:创建目标

重要

此过程中的所有步骤都需要在日志数据接收者账户中完成。

创建目标时,CloudWatch Logs 将代表收件人账户向目标发送测试消息。当订阅筛选条件稍后处于活动状态时,CloudWatch Logs 会代表源账户向目标发送录入事件。

创建目标
  1. 请等待,直至您在 步骤 1:创建 Firehose 传输流 中创建的 Firehose 流变为活动状态。您可使用以下命令检查 StreamDescription.StreamStatus 属性。

    aws firehose describe-delivery-stream --delivery-stream-name "my-delivery-stream"

    此外,请记下 DeliveryStreamDescription.DeliveryStreamARN 值,因为后面的步骤中将需要用到它。此命令的示例输出:

    { "DeliveryStreamDescription": { "DeliveryStreamName": "my-delivery-stream", "DeliveryStreamARN": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream", "DeliveryStreamStatus": "ACTIVE", "DeliveryStreamEncryptionConfiguration": { "Status": "DISABLED" }, "DeliveryStreamType": "DirectPut", "VersionId": "1", "CreateTimestamp": "2021-02-01T23:59:15.567000-08:00", "Destinations": [ { "DestinationId": "destinationId-000000000001", "S3DestinationDescription": { "RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket", "BufferingHints": { "SizeInMBs": 5, "IntervalInSeconds": 300 }, "CompressionFormat": "UNCOMPRESSED", "EncryptionConfiguration": { "NoEncryptionConfig": "NoEncryption" }, "CloudWatchLoggingOptions": { "Enabled": false } }, "ExtendedS3DestinationDescription": { "RoleARN": "arn:aws:iam::222222222222:role/FirehosetoS3Role", "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket", "BufferingHints": { "SizeInMBs": 5, "IntervalInSeconds": 300 }, "CompressionFormat": "UNCOMPRESSED", "EncryptionConfiguration": { "NoEncryptionConfig": "NoEncryption" }, "CloudWatchLoggingOptions": { "Enabled": false }, "S3BackupMode": "Disabled" } } ], "HasMoreDestinations": false } }

    您的传输流可能需要一两分钟才会显示为活动状态。

  2. 当传输流处于活动状态时,请创建 IAM 角色,该角色将向 CloudWatch Logs 授予将数据放入 Firehose 流的权限。首先,您需要在文件 ~/TrustPolicyForCWL.json 中创建信任策略。使用文本编辑器创建此策略。有关 CloudWatch Logs 端点的更多信息,请参阅 Amazon CloudWatch Logs 端点和配额

    此策略包括指定 sourceAccountIdaws:SourceArn 全局条件上下文密钥,有助于避免出现混淆代理安全问题。如果您在第一次调用中还不知道源账户 ID,则建议您将目标 ARN 放在源 ARN 字段中。在随后的调用中,应将源 ARN 设置为从第一次调用中收集的实际源 ARN。有关更多信息,请参阅 混淆代理问题防范

    { "Statement": { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceArn": [ "arn:aws:logs:region:sourceAccountId:*", "arn:aws:logs:region:recipientAccountId:*" ] } } } }
  3. 使用 aws iam create-role 命令创建 IAM 角色,并指定您刚创建的信任策略文件。

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

    以下内容为示例输出。记下返回的 Role.Arn 值,因为您需要在后面的步骤中用到它。

    { "Role": { "Path": "/", "RoleName": "CWLtoKinesisFirehoseRole", "RoleId": "AROAR3BXASEKYJYWF243H", "Arn": "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole", "CreateDate": "2023-02-02T08:10:43+00:00", "AssumeRolePolicyDocument": { "Statement": { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:SourceArn": [ "arn:aws:logs:region:sourceAccountId:*", "arn:aws:logs:region:recipientAccountId:*" ] } } } } } }
  4. 创建权限策略以定义 CloudWatch Logs 可对您的账户执行的操作。首先,使用文本编辑器在文件 ~/PermissionsForCWL.json 中创建权限策略:

    { "Statement":[ { "Effect":"Allow", "Action":["firehose:*"], "Resource":["arn:aws:firehose:region:222222222222:*"] } ] }
  5. 通过输入以下命令,将权限策略与角色关联:

    aws iam put-role-policy --role-name CWLtoKinesisFirehoseRole --policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL.json
  6. 在 Firehose 传输流变为活动状态并且您已创建 IAM 角色后,便可以创建 CloudWatch Logs 目标。

    1. 此步骤不会将访问策略与您的目标关联,它只是完成目标创建的两个步骤中的第一个步骤。记下有效负载中返回的新目标的 ARN,因为您将在后续步骤中使用它作为 destination.arn

      aws logs put-destination \ --destination-name "testFirehoseDestination" \ --target-arn "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream" \ --role-arn "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole" { "destination": { "destinationName": "testFirehoseDestination", "targetArn": "arn:aws:firehose:us-east-1:222222222222:deliverystream/my-delivery-stream", "roleArn": "arn:aws:iam::222222222222:role/CWLtoKinesisFirehoseRole", "arn": "arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination"} }
    2. 上一步骤完成后,在日志数据接收者账户 (222222222222) 中将访问策略与目标关联。此策略使得日志数据发送者账户(111111111111)可以仅访问日志数据接收者账户(222222222222)中的目标。您可以使用文本编辑器将此策略放在 ~/AccessPolicy.json 文件中:

      { "Version" : "2012-10-17", "Statement" : [ { "Sid" : "", "Effect" : "Allow", "Principal" : { "AWS" : "111111111111" }, "Action" : ["logs:PutSubscriptionFilter","logs:PutAccountPolicy"], "Resource" : "arn:aws:logs:us-east-1:222222222222:destination:testFirehoseDestination" } ] }
    3. 这将创建一个策略,该策略定义了对目标具有写入权限的人。此策略必须指定 logs:PutSubscriptionFilterlogs:PutAccountPolicy 操作才能访问目标。跨账户用户将使用 PutSubscriptionFilterPutAccountPolicy 操作向目标发送日志事件。

      aws logs put-destination-policy \ --destination-name "testFirehoseDestination" \ --access-policy file://~/AccessPolicy.json