[アップデート] AWS Elemental MediaStoreがアクセスログをサポートしました!

AWS Elemental MediaStoreでアクセスログの出力がサポートされました。アクセスログはコンテナごとに有効無効が設定でき、Amazon CloudWatch LogsにJSON形式で出力されます。
2019.03.31

はじめに

清水です。AWS Media Servicesの細かなアップデートを追っていくコーナーです。本エントリで紹介するのはこちら、AWS Elemental MediaStoreでアクセスログの出力がサポートされました。(2019/02/26にアップデートされた内容となります。)

メディア向けに最適化されたストレージサービスであり、Amazon S3よりも整合性の強いストレージでもあるAWS Elemental MediaStore、実はこれまでアクセスログが提供されていませんでしたが、今回のアップデートで晴れてアクセスログの出力がサポートされたこととなります!アクセスログはコンテナごとに有効、無効が設定でき、出力はAmazon CluodWatch LogsにJSON形式で書き出されます。

AWS Elemental MediaStoreからAmazon CloudWatchへのアクセスを許可するIAMポリシーとIAMロールを作成する

アクセスログを有効にする前にまず、AWS Elemental MediaStoreからAmazon CloudWatchへのアクセスを許可するIAMポリシーとIAMロールを作成する必要があります。ドキュメントの下記ページを参考に作成していきます。

AWSマネジメントコンソールのIAMのPolicies画面で[Create policy]から進みます。

Create policy画面でJSONタブを選択、下記の内容をペーストします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups",
                "logs:CreateLogGroup"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/mediastore/*"
        }
    ]
}

[Review policy]ボタンでポリシー確認画面に進み、ポリシー名MediaStoreAccessLogsPolicyを入力し[Create policy]でポリシーを作成します。

続いて、AWSマネジメントコンソールのIAMのRoles画面で[Create role]から進み、IAMロールを作成します。

Create role画面でSelect type of trusted entityでAnother AWS accountを選択、Account IDとして 自分のAWSアカウントID を入力します。

[Next: Permissions]ボタンで次の画面へ、検索ボックスにMediaStoreAccessLogsPolicyを入力して先ほど作成したPolicyを選択します。

[Next: Tags]ボタンで次の画面に進み、必要であればTag情報を付与しておきます(今回は指定せず進めました)。[Next: Review]ボタンで確認画面に進み、Role nameとしてMediaStoreAccessLogsを入力、[Create role]でロールを作成します。

IAMロールMediaStoreAccessLogsを作成後、Summary画面に進みTrust relationshipsタブを選択、Edit trust relationshipボタンで信頼関係を編集します。

Principal部分を、"AWS": "arn:aws:iam::123456789012:root"から"Service": "mediastore.amazonaws.com"に変更します。

編集前

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

編集後

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "mediastore.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

以上でポリシーならびロールの作成が完了です。

AWS Elemental MediaStoreでアクセスログを有効化してみる

続いて、AWS Elemental MediaStoreでアクセスログを有効にします。アクセスログはMediaStoreのContainer単位で有効無効が設定できます。設定にはAWS CLIのmediastore start-access-loggingコマンドを使用します。(現在のところAWSマネジメントコンソールからの変更はサポート されていないようです。)

aws mediastore start-access-logging --container-name [コンテナ名]

設定前後でaws mediastore describe-containerコマンドを用いて、アクセスログが有効になることを確認しておきましょう。

アクセスログ有効化前

$ aws mediastore describe-container --container-name MSContainerA
{
    "Container": {
        "Endpoint": "https://xxxxxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com",
        "CreationTime": 1524047221.0,
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/MSContainerA",
        "Name": "MSContainerA",
        "Status": "ACTIVE",
        "AccessLoggingEnabled": false
    }
}

アクセスログの有効化(返り値はありません)

$ aws mediastore start-access-logging --container-name MSContainerA

アクセスログの有効化後

$ aws mediastore describe-container --container-name MSContainerA
{
    "Container": {
        "Endpoint": "https://xxxxxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com",
        "CreationTime": 1524047221.0,
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/MSContainerA",
        "Name": "MSContainerA",
        "Status": "ACTIVE",
        "AccessLoggingEnabled": true
    }
}

AWS Elemental MediaStoreで実際にアクセスログを確認してみる

では実際にMediaStoreのアクセスログを確認してみましょう。AWS Elemental MediaLiveとAWS Elemental MediaStoreでライブ配信を行っている環境下でのアクセスログを確認してみました。(ブラウザで映像を視聴していますが、Amazon CloudFrontは利用せず、AWS Elemental MediaStoreに直接アクセスしています。)

以下、それぞれMediaLiveからのPutObjectのアクセスログ、ブラウザからのMediaStoreへのGetObjectのアクセスログの1レコードとなります。

MediaLiveからのPutObjectのアクセスログ

{
    "Path": "/20190331AccessLogsTest/hls.m3u8",
    "AWSAccountId": "123456789012",
    "RequestID": "OQAOF4BPNKLWO24GEL4QWPTGBJQ6HFGD4AHW6JVV2GY36QC2PP7I6TTE3XQMU5F7ZPSZAIWXTWP74K3TZM3CBMI",
    "ReceivedTime": "2019-03-31T12:46:39.006Z",
    "Operation": "PutObject",
    "Source": "medialive.amazonaws.com",
    "Requester": "arn:aws:sts::123456789012:assumed-role/MediaLiveAccessRole/medialive_ap-northeast-1_123456789012_8319821-0",
    "ContainerName": "MSContainerA",
    "TurnAroundTime": 22,
    "TotalTime": 24,
    "BytesSent": 184,
    "ErrorCode": null,
    "HTTPStatus": 200
}

ブラウザからMediaStoreへのGetObjectのアクセスログ

{
    "Path": "/20190331AccessLogsTest/hls.m3u8",
    "AWSAccountId": "123456789012",
    "RequestID": "MLEINX3JSQA446GXNS3XK6T4OVYZENXLYZPUKZV7ULD32XVB446YOMYQ72NCO2BONWRSJX6UXVGZO4MWSJAKJUY",
    "ReceivedTime": "2019-03-31T12:48:34.74Z",
    "Operation": "GetObject",
    "Source": "XXX.XXX.XXX.XXX",
    "Requester": "anonymous",
    "ContainerName": "MSContainerA",
    "TurnAroundTime": null,
    "TotalTime": 12,
    "BytesSent": 385,
    "ErrorCode": null,
    "HTTPStatus": 200
}

以上が1レコードずつなのですが、例えばライブ配信実施時、全体としては相当数のアクセスログが出力されます。正直なところCloudWatch Logsのマネジメントコンソールから追っていくのは少し難しそうな印象です。

まとめ

AWS Elemental MediaStoreの新機能であるアクセスログ出力サポートについて、実際に有効化設定を行い、出力されたアクセスログを確認してみました。これまでアクセスログが提供されておらず、なにかトラブルなど発生した際の原因究明手段が限られていた、などがあったかもしれませんが、アクセスログ出力をサポートしたことでこれらの調査などが行いやすくなると思います。ただし、アクセスログについてはAmazon CloudWatch LogsにJSON形式で出力されますので、解析方法など通常のプレーンテキストのログ(例えばApache httpdのアクセスログのような)と比べて一工夫必要になるかなと思います。なにかあったときにもすばやくアクセスログを解析できるよう、その手法も確認しておきたいですね。引き続きAWS MediaStoreをはじめとしたAWS Media Servicesの機能アップデートに注目していきたいと思います!