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

4 分的閱讀內容
0

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

解決方法

若要將 CloudWatch Logs 傳送到不同區域的 Firehose 串流,該區域必須支援 Firehose

在解決方法的命令中,將下列值取代為您的值:

  • 以您目的地帳戶的 ID 取代 111111111111
  • 以 Firehose 區域取代 us-east-1
  • 以您的 Amazon Simple Storage Service (Amazon S3) 區域取代 us-west-2
  • 以您目的地帳戶 ID 的區域取代 us-east-2
  • 以您來源帳戶的 ID 取代 222222222222
  • 以您 CloudWatch Log 群組的區域取代 us-east2
  • 以您 Amazon Virtual Private Cloud (Amazon VPC) 流量日誌的區域取代 us-east-2
  • 以資源的 ARN 取代 -arn

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

設定目的地帳戶

請完成下列步驟:

  1. 建立 Amazon S3 儲存貯體:

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

    注意: 請記下輸出中儲存貯體的 ARN,以便後續步驟中使用。

  2. 建立擁有所需 Firehose 權限的信任政策,以將資料推送到 Amazon S3:

    {
      "Statement": {
        "Effect": "Allow",
        "Principal": {
          "Service": "firehose.amazonaws.com"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "111111111111"
          }
        }
      }
    }
  3. 若要建立 IAM 角色並指定信任政策,請執行 create-role 命令:

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

    注意: 請記下輸出中角色的 ARN,以便後續步驟中使用。

  4. 若要定義 Firehose 可在目的地帳戶中執行的動作,請使用 JSON 編輯器來建立權限政策

    {
        "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. 執行 put-role-policy 命令,將權限政策與 IAM 角色關聯:

    aws iam put-role-policy --role-name FirehosetoS3Role --policy-name Permissions-Policy-For-Firehose --policy-document file://~/PermissionsForFirehose.json
  6. 為 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

    注意: 以您的角色和儲存貯體 ARN 取代 RoleARNBucketARN
    當您將 S3 物件交付到 Firehose,自訂前綴即會用於 timestamp 命名空間運算式。您可以在時間格式的開頭指定額外的前綴 (YYY/mm/dd/HH/)。如果前綴結尾是正斜線 (/),即會在 S3 儲存貯體中顯示為資料夾。

  7. 若要檢查 DeliveryStreamDescription.DeliveryStreamStatus 屬性,請執行 describe-delivery-stream 命令:

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

    若要確認串流作用中,請檢查命令輸出:

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

    注意: 請記下串流的 ARN,以在後續步驟中使用。

  8. 建立額外的信任政策,以授予 CloudWatch Logs 將資料放入 Firehose 串流的權限。新增推送日誌的地區:

    {
      "Version": "2012-10-17",
      "Statement": {
        "Effect": "Allow",
        "Principal": {
          "Service": "logs.us-east-2.amazonaws.com"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringLike": {
            "aws:SourceArn": [
              "arn:aws:logs:us-east-2:sourceAccountId:*",
              "arn:aws:logs:us-east-2:recipientAccountId:*"
            ]
          }
        }
      }
    }
  9. 若要建立一個額外的 IAM 角色以將資料放入 Firehose 串流中,並指定信任政策檔案,請執行 create-role 命令:

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

    注意: 請記下角色的 ARN,以在後續步驟中使用。

  10. 建立權限政策,以定義 CloudWatch Logs 可以在目的地帳戶中執行的動作。包括串流的 ARN 和角色的 ARN:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "firehose:ListDeliveryStreams",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "firehose:DescribeDeliveryStream",
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Resource": "arn:aws:firehose:us-east-1:111111111111:deliverystream/my-delivery-stream"
        }
    ]
}
  1. 執行 put-role-policy 命令將權限政策與角色建立關聯:
aws iam put-role-policy --role-name CWLtoKinesisFirehoseRole --policy-name Permissions-Policy-For-CWL --policy-document file://~/PermissionsForCWL.json
  1. 若要在目的地帳戶中建立用於傳送日誌的來源帳戶目的地,請執行 put-destination 命令:
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

注意: 您可以在任何支援 Firehose 的地區中,建立交付串流的目的地。您建立目的地的地區必須與日誌來源地區相同。 為 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"
    }
  ]
}
  1. 將存取政策與 CloudWatch 目的地建立關聯:
aws logs put-destination-policy --destination-name "myDestination" --access-policy file://~/AccessPolicy.json --region us-east-2
  1. 若要驗證目的地,請執行 describe-destinations 命令:
aws logs describe-destinations --region us-east-2

設定來源帳戶

注意: 若要設定來源帳戶,您必須是該帳戶的 IAM 管理員使用者或根使用者。

請完成下列步驟:

  1. 建立信任政策,以授予 Amazon VPC 流程日誌傳送資料至 CloudWatch Log 群組的權限:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "vpc-flow-logs.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  2. 執行 create-role 命令並指定信任政策:

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

    注意: 請記下輸出中角色的 ARN,以便後續步驟中使用。

  3. 若要定義 VPC 流程日誌可以在來源帳戶中執行的動作,請建立權限政策:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "logs:DescribeLogGroups",
            "logs:DescribeLogStreams"
          ],
          "Effect": "Allow",
          "Resource": "*"
        }
      ]
    }
  4. 若要將權限政策與 IAM 角色建立關聯,請執行 put-role-policy 命令:

    aws iam put-role-policy --role-name PublishFlowLogs --policy-name Permissions-Policy-For-VPCFlowLogs --policy-document file://~/PermissionsForVPCFlowLogs.json
  5. 若要設定流程日誌的目的地,請執行 create-log-group 命令以建立 CloudWatch Log 群組:

    aws logs create-log-group --log-group-name vpc-flow-logs --region us-east-2
  6. 若要開啟 VPC 流程日誌,請執行 create-flow-logs 命令:

    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
  7. 若要在目的地帳戶中將 CloudWatch Log 群組訂閱到 Firehose,請執行 put-subscription-filter 命令:

    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

    若要確認已發佈日誌,請檢查 S3 儲存貯體中的新日誌

相關資訊

DeliveryStreamDescription

AWS 官方
AWS 官方已更新 7 個月前