AWS CLI を使用してログデータを Amazon S3 にエクスポートする - Amazon CloudWatch Logs

AWS CLI を使用してログデータを Amazon S3 にエクスポートする

次の例では、エクスポートタスクを使用して、すべてのデータを my-log-group という名前の CloudWatch Logs ロググループから my-exported-logs という名前の Amazon S3 バケットにエクスポートします。この例では、「my-log-group」というロググループを作成済みであることを前提としています。

AWS KMS によって暗号化された S3 バケットへのログデータのエクスポートがサポートされています。

ステップ 1: S3 バケットを作成する。

CloudWatch Logs 専用に作成したバケットを使用することをお勧めします。ただし、既存のバケットを使用する場合は、ステップ 2 に進むことができます。

注記

S3 バケットは、エクスポートするログデータと同じリージョンに存在している必要があります。CloudWatch Logs は、別のリージョンの S3 バケットへのデータのエクスポートをサポートしていません。

AWS CLI を使用して S3 バケットを作成するには

コマンドプロンプトで、次の create-bucket コマンドを実行します。ここで、LocationConstraint はログデータをエクスポートするリージョンです。

aws s3api create-bucket --bucket my-exported-logs --create-bucket-configuration LocationConstraint=us-east-2

以下は出力例です。

{ "Location": "/my-exported-logs" }

ステップ 2: Amazon S3 および CloudWatch Logs へのフルアクセス権を持つ IAM ユーザーを作成する

以下のステップで、必要なアクセス許可を持つ IAM ユーザーを作成します。

ユーザーを作成し、アクセス許可を割り当てるには
  1. IAM ユーザーを作成するには、次のコマンドを入力します。

    aws iam create-user --user-name CWLExportUser
  2. IAM 管理ポリシーを、先ほど作成した IAM ユーザーにアタッチします。

    export S3POLICYARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].{ARN:Arn}' --output text)
    export CWLPOLICYARN=$( aws iam list-policies --query 'Policies[?PolicyName==`CloudWatchLogsFullAccess`].{ARN:Arn}' --output text)
    aws iam attach-user-policy --user-name CWLExportUser --policy-arn $S3POLICYARN
    aws iam attach-user-policy --user-name CWLExportUser --policy-arn $CWLPOLICYARN
  3. 2 つの管理ポリシーがアタッチされていることを確認します。

    aws iam list-attached-user-policies --user-name CWLExportUser
  4. CWLExportUser IAM ユーザーの IAM 認証情報を含むように AWS CLI を設定します。詳細については、「AWS CLI の設定」を参照してください。

ステップ 3: S3 バケットのアクセス許可を設定する

すべての S3 バケットとオブジェクトは、デフォルト状態でプライベートに設定されます。バケットを作成したアカウント (リソース所有者) のみが、バケットとそれに含まれるオブジェクトにアクセスできます。ただし、リソース所有者は、アクセスポリシーを記述することで他のリソースおよびユーザーにアクセス権限を付与することができます。

重要

S3 バケットへのエクスポートをより安全にするために、ログデータを S3 バケットにエクスポートできるソースアカウントのリストの指定が必要になりました。以下の例では、これらのアカウント ID のリストが、aws:SourceAccount キーの中で指定されています。

S3 バケットが作成されたアカウントのアカウント ID も含めることで、エクスポートを同じアカウント内で行えるようにすることをお勧めします。

S3 バケットでアクセス許可を設定するには
  1. policy.json という名前のファイルを作成し、次のアクセスポリシーを追加します。このとき、Resource を S3 バケットの名前に変更し、Principal をログデータのエクスポート先のリージョンのエンドポイントに変更します。テキストエディタを使用してこのポリシーファイルを作成します。IAM コンソールを使用しないでください。

    { "Version": "2012-10-17", "Statement": [ { "Action": "s3:GetBucketAcl", "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs", "Principal": { "Service": "logs.us-east-2.amazonaws.com" } }, { "Action": "s3:PutObject" , "Effect": "Allow", "Resource": "arn:aws:s3:::my-exported-logs/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceAccount": [ "AccountId1", "AccountId2", ... ] } }, "Principal": { "Service": "logs.us-east-2.amazonaws.com" } } ] }
  2. put-bucket-policy コマンドを使用して、バケットでアクセスポリシーとして先ほど追加したポリシーを設定します。このポリシーにより、CloudWatch Logs は S3 バケットにログデータをエクスポートできるようになります。バケット所有者には、エクスポートされたすべてのオブジェクトに対する完全なアクセス権限があります。

    aws s3api put-bucket-policy --bucket my-exported-logs --policy file://policy.json
    警告

    バケットにアタッチされているポリシーがすでに 1 つ以上ある場合は、そのポリシーに CloudWatch Logs アクセスのステートメントを追加します。バケットにアクセスするユーザーに適したアクセス許可であることを確認するために、アクセス許可の結果セットを評価することをお勧めします。

(オプション) ステップ 4: SSE-KMS で暗号化されたバケットへのエクスポート

このステップは、AWS KMS keys によるサーバー側の暗号化を使用する S3 バケットに対し、エクスポートを行う場合にのみ必要です。この暗号化は SSE−KMS と呼ばれます。

SSE-KMS で暗号化されたバケットにエクスポートするには
  1. テキストエディタを使用して key_policy.json という名前のファイルを作成し、以下のアクセスポリシーを追加します。ポリシーを追加する際、以下の点を変更します。

    • Region を、実際のログのリージョンに置き換えます。

    • account-ARN を、KMS キーを所有するアカウントの ARN に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Allow CWL Service Principal usage", "Effect": "Allow", "Principal": { "Service": "logs.Region.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "account-ARN" }, "Action": [ "kms:GetKeyPolicy*", "kms:PutKeyPolicy*", "kms:DescribeKey*", "kms:CreateAlias*", "kms:ScheduleKeyDeletion*", "kms:Decrypt" ], "Resource": "*" } ] }
  2. 次のコマンドを入力します。

    aws kms create-key --policy file://key_policy.json

    以下は、このコマンドに対する出力例です。

    { "KeyMetadata": { "AWSAccountId": "account_id", "KeyId": "key_id", "Arn": "arn:aws:kms:us-east-2:account_id:key/key_id", "CreationDate": "time", "Enabled": true, "Description": "", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "Origin": "AWS_KMS", "KeyManager": "CUSTOMER", "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeySpec": "SYMMETRIC_DEFAULT", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ], "MultiRegion": false }
  3. テキストエディタを使用して、bucketencryption.json という名前のファイルを作成し、次の内容を記述します。

    { "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "{KMS Key ARN}" }, "BucketKeyEnabled": true } ] }
  4. 次のコマンドを実行します。その際、bucket-name を、ログをエクスポートするバケットの名前に置き換えます。

    aws s3api put-bucket-encryption --bucket bucket-name --server-side-encryption-configuration file://bucketencryption.json

    コマンドがエラーを返さなければ、このプロセスは成功しています。

ステップ 5: エクスポートタスクを作成する

ロググループからログをエクスポートするためのエクスポートタスクを作成すると、エクスポートするデータのサイズに応じて、エクスポートタスクに数秒から数時間かかる可能性があります。

AWS CLI を使用してエクスポートタスクを作成するには

コマンドプロンプトで、次の create-export-task コマンドを使用してエクスポートタスクを作成します。

aws logs create-export-task --profile CWLExportUser --task-name "my-log-group-09-10-2015" --log-group-name "my-log-group" --from 1441490400000 --to 1441494000000 --destination "my-exported-logs" --destination-prefix "export-task-output"

以下は出力例です。

{ "taskId": "cda45419-90ea-4db5-9833-aade86253e66" }

ステップ 6: エクスポートタスクの詳細を表示する

エクスポートタスクを作成すると、タスクの現在のステータスを取得できます。

AWS CLI を使用してエクスポートタスクを記述するには

コマンドプロンプトで、次の describe-export-tasks コマンドを使用します。

aws logs --profile CWLExportUser describe-export-tasks --task-id "cda45419-90ea-4db5-9833-aade86253e66"

以下は出力例です。

{ "exportTasks": [ { "destination": "my-exported-logs", "destinationPrefix": "export-task-output", "executionInfo": { "creationTime": 1441495400000 }, "from": 1441490400000, "logGroupName": "my-log-group", "status": { "code": "RUNNING", "message": "Started Successfully" }, "taskId": "cda45419-90ea-4db5-9833-aade86253e66", "taskName": "my-log-group-09-10-2015", "tTo": 1441494000000 }] }

describe-export-tasks コマンドを使用する方法は 3 通りあります。

  • フィルタなし – すべてのエクスポートタスクが、作成順とは逆の順序でリストされます。

  • タスク ID でフィルタリング – 指定された ID のエクスポートタスクが存在する場合に、それらがリストされます。

  • タスクステータスによるフィルタリング – 指定されたステータスのエクスポートタスクがリストされます。

例えば、FAILED ステータスでフィルタリングするには、次のコマンドを使用します。

aws logs --profile CWLExportUser describe-export-tasks --status-code "FAILED"

以下は出力例です。

{ "exportTasks": [ { "destination": "my-exported-logs", "destinationPrefix": "export-task-output", "executionInfo": { "completionTime": 1441498600000 "creationTime": 1441495400000 }, "from": 1441490400000, "logGroupName": "my-log-group", "status": { "code": "FAILED", "message": "FAILED" }, "taskId": "cda45419-90ea-4db5-9833-aade86253e66", "taskName": "my-log-group-09-10-2015", "to": 1441494000000 }] }

ステップ 7: エクスポートタスクをキャンセルする

エクスポートタスクが PENDING または RUNNING の状態にある場合、そのタスクをキャンセルできます。

AWS CLI を使用してエクスポートタスクをキャンセルするには

コマンドプロンプトで、次の cancel-export-task コマンドを使用します。

aws logs --profile CWLExportUser cancel-export-task --task-id "cda45419-90ea-4db5-9833-aade86253e66"

describe-export-tasks コマンドを使用して、タスクが正常にキャンセルされたことを確認できる点に注意してください。