Amazon CloudWatch Logs のクロスアカウントを Kinesis Data Firehose にプッシュするにはどうすればよいですか?

最終更新日: 2021 年 3 月 16 日

Amazon CloudWatch Logs を Amazon Kinesis Data Firehose から別のリージョンの別のアカウントにストリーミングしようと考えています。Kinesis Data Firehose から別のリージョンの Amazon Simple Storage Service (Amazon S3) バケットへのクロスアカウントストリームを設定するにはどうすればよいですか?

簡単な説明

別の AWS リージョンの Kinesis Data Firehose ストリームに Amazon CloudWatch Logs を送信しようとすると、失敗する可能性があります。

重要: お住まいのリージョンが 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

場所の制約は、バケットが 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 が作成した 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 に正常に配信されると、 タイムスタンプ名前空間式に カスタムプレフィックスが使用されます。時間形式プレフィクス (yyyy/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

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.    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/CWLtoKinesisRole" --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 ロールと信頼ポリシーを作成して、CloudWatch Logs ロググループにデータを送信するアクセス許可を VPC フローログに付与します。
{
    "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.    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

--resource-ids--deliver-logs-permission-arn プレースホルダーの値を VPC ID および VPC フローログロールに置き換えます。

7.     CloudWatch Logs グループを、送信先アカウントの Kinesis データファイアホースにサブスクライブします。

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 バケットをチェックして、ログが公開されていることを確認します。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?