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

最終更新日: 2020 年 11 月 17 日

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.    ターゲットアカウントに 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.    送信先アカウントの S3 バケット内のログイベントのフローを検証します。 

解決方法

送信先アカウントの設定

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:707800713736: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:::kirubha-knowledge-article-test"
                }, 
                "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.    ターゲットアカウントに送信先を作成することで、ソースアカウントで送信先ソースの ARN 値を使用できるようにします。

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

</p


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


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