如何將 Amazon CloudWatch Logs 跨帳戶推送到 Kinesis Data Firehose?

4 分的閱讀內容
0

我想將 Amazon Kinesis Data Firehose 的 Amazon CloudWatch Logs 串流到不同 AWS 地區的另一個帳戶。

簡短說明

若要將 Amazon CloudWatch Logs 傳送到不同地區的 Kinesis 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 的目的地。為 Amazon CloudWatch Logs 服務建立 IAM 角色,以將資料推送到 Kinesis Data Firehose 服務。然後,建立記錄推送位置的目的地交付串流。

3.    開啟 VPC 流程日誌,然後將日誌推送到來源帳戶的 Amazon CloudWatch。

4.    在指向目的地帳戶的來源帳戶中建立訂閱篩選條件

5.    在目的地帳戶的 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.    建立 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 儲存貯體。使用您的 AWS 帳戶 ID 取代 111111111111

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

使用您建立的角色和儲存貯體 Amazon Resource Names (ARN) 取代 RoleARNBucketARN

注意: 當您成功將 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.    建立授予 CloudWatch Logs 將資料放入 Kinesis Data Firehose 串流之權限的 IAM 角色和信任原則。請務必新增推送日誌的地區:

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

9.    若要建立 IAM 角色並指定信任原則檔案,請使用 create-role 命令:

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"
    }
  ]
}

使用您所建立之 Amazon Virtual Private Cloud (Amazon VPC) 位置所在的 AWS 來源帳戶取代 222222222222

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

注意: 在稍後的步驟中,您會使用傳回的 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 Logs 日誌群組,以設定 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

注意: 使用您的 VPC ID 和 VPC 流程日誌角色取代 --resource-ids--deliver-logs-permission-arn 預留位置值。

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-2:111111111111:destination:myDestination" --region us-east-2

更新 --destination ARN 值,然後使用目的地帳戶號碼取代「111111111111」。

8.    檢查 S3 儲存貯體以確認日誌均已發佈。

相關資訊

DeliveryStreamDescription

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