AWS Elemental MediaStoreをAWS CLIで操作してみた 〜Object操作系コマンド編〜

はじめに

清水です。re:Invent 2017でリリースされたMedia五兄弟こと(?)AWS Media Services、本エントリではメディア最適化ストレージであるAWS Elemental MediaStoreについてAWS CLIで操作してみました。先に公開した以下のContainer操作系コマンド編に続き、Object操作系コマンドmediastore-dataについても触ってみたので本エントリにまとめてみます。

AWS Elemental MediaStoreをAWS CLIで操作してみた 〜Container操作系コマンド編〜

やってみた

オブジェクト操作系のコマンドはaws mediastore-dataで始まるコマンドで、以下の5つが用意されています。 (mediastore-data — AWS CLI Command Reference

  • delete-object
  • describe-object
  • get-object
  • list-items
  • put-object

それぞれのコマンドの書式、操作してみた結果をまとめます。なお本エントリではmac OS Sierra上の以下の環境で検証を行いました。

 $ aws --version
aws-cli/1.14.17 Python/2.7.10 Darwin/16.7.0 botocore/1.8.21

list-items

オブジェクト並びにフォルダをリストするコマンドです。--endpointでContainerのEndpointを指定し、--pathでリストするパスを指定します。

  • aws mediastore-data list-items --endpoint <value> --path <value>

ContainerのEndpointについては、以下のようにコンテナ名からaws mediastore list-containersコマンドなどを用いて取得できます。

$ aws mediastore list-containers \
    --query 'Containers[?Name==`MediaStoreContainer1222A`].[Endpoint]'
[
    [
        "https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com"
    ]
]

--pathオプションを省略すると最上位の階層のリストを返しました。

$ aws mediastore-data list-items \
  --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com
{
    "Items": [
        {
            "Type": "FOLDER",
            "Name": "live"
        }
    ]
}

--path /liveとフォルダ名をパスで指定してみます。

$ aws mediastore-data list-items \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /live
{
    "Items": [
        {
            "ContentType": "video/MP2T",
            "Name": "myStream_240p30_00174.ts",
            "LastModified": 1513942825.915,
            "ContentLength": 747676,
            "ETag": "042982829513a08646cd15aa74c92ebcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Type": "OBJECT"
        },
        {
            "ContentType": "video/MP2T",
            "Name": "myStream_480p30_00166.ts",
            "LastModified": 1513942777.923,
            "ContentLength": 1328972,
            "ETag": "db128d7eaab9b93d576fd7223a586d5aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Type": "OBJECT"
        },
<以下、出力割愛>

describe-object

オブジェクトのヘッダー情報の詳細を表示するコマンドです。list-itemsと同様、--endpointでContainerのEndpointを指定し、--pathで詳細表示するオブジェクトのパスを指定します。

  • aws mediastore-data describe-object --endpoint <value> --path <value>
$ aws mediastore-data describe-object \
  --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
  --path /live/myStream_480p30_00166.ts
{
    "LastModified": "Fri, 22 Dec 2017 11:39:37 GMT",
    "ContentLength": "1328972",
    "ETag": "db128d7eaab9b93d576fd7223a586d5aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "ContentType": "video/MP2T"
}

get-object

オブジェクトをダウンロードするコマンドになります。ダウンロードにはオブジェクトへのパス情報が必要です。

  • aws mediastore-data --endpoint <value> --path <value> [--range <value>] <outfile>

/live/myStream.m3u8というファイルをダウンロードしてみます。

$ aws mediastore-data describe-object \
  --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
  --path /live/myStream.m3u8
{
    "ContentType": "application/vnd.apple.mpegurl",
    "LastModified": "Fri, 22 Dec 2017 11:23:20 GMT",
    "ContentLength": "748",
    "ETag": "91e2b9b3dc86d54b69f873d6241168c8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "CacheControl": "max-age=3"
}
$ aws mediastore-data get-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /live/myStream.m3u8 \
    myStream.m3u8
{
    "ContentType": "application/vnd.apple.mpegurl",
    "LastModified": "Fri, 22 Dec 2017 11:23:20 GMT",
    "ContentLength": "748",
    "ETag": "91e2b9b3dc86d54b69f873d6241168c8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "CacheControl": "max-age=3",
    "StatusCode": 200
}

ダウンロードできたか確認してみます。

  $ ls -l | grep myStream.m3u8
-rw-r--r--    1 shimizu.toshiya  staff   748  1  9 18:14 myStream.m3u8
 $ cat myStream.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5640800,AVERAGE-BANDWIDTH=5640800,CODECS="avc1.640032,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO"
myStream_1080p30.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3440800,AVERAGE-BANDWIDTH=3440800,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO"
myStream_720p30.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1861200,AVERAGE-BANDWIDTH=1861200,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=640x480,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO"
myStream_480p30.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1036200,AVERAGE-BANDWIDTH=1036200,CODECS="avc1.4d400d,mp4a.40.2",RESOLUTION=320x240,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO"
myStream_240p30.m3u8

--rangeオプションを使うことでデータの一部のみをダウンロードすることもできます。

$ aws mediastore-data get-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /live/myStream.m3u8 \
    --range "bytes=100-200" \
    myStream_100-200.m3u8
{
    "ContentType": "application/vnd.apple.mpegurl",
    "LastModified": "Fri, 22 Dec 2017 11:23:20 GMT",
    "ContentRange": "bytes 100-200/748",
    "ETag": "91e2b9b3dc86d54b69f873d6241168c8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "CacheControl": "max-age=3",
    "ContentLength": "101",
    "StatusCode": 206
}
 $ ll | grep myStream
-rw-r--r--    1 shimizu.toshiya  staff   748  1  9 18:14 myStream.m3u8
-rw-r--r--    1 shimizu.toshiya  staff   101  1  9 18:21 myStream_100-200.m3u8
 $ cat myStream_100-200.m3u8
DWIDTH=5640800,CODECS="avc1.640032,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=30.000,AUDIO="PROGRAM_A

put-object

オブジェクトをアップロードするコマンドです。アップロードするコンテナのEndpoint、アップロードするパス情報が必要です。

  • aws mediastore-data put-object --endpoint <value> --body <value> --path <value>

Sample1_HLS.m3u8というファイルを/awscli/Sample1_HLS.m3u8としてアップロードしてみます。

$ aws mediastore-data put-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --body Sample1_HLS.m3u8 \
    --path /awscli/Sample1_HLS.m3u8
{
    "ContentSHA256": "1224729c047557811b3b057d993865ceXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "StorageClass": "TEMPORAL",
    "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

アップロード後、describe-objectコマンドで確認をしてみます。

$ aws mediastore-data describe-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /awscli/Sample1_HLS.m3u8
{
    "LastModified": "Tue, 09 Jan 2018 09:38:25 GMT",
    "ContentLength": "225",
    "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "ContentType": "binary/octet-stream"
}

put-objectコマンドでは--content-typeでContentTypeの指定が、また--cache-controlでCache Controlヘッダの指定ができます。

先ほどと同じファイルを/awscli/Sample1_HLS_2.m3u8というパスでアップロード、ContentTypeとCacheControlヘッダを指定してみます。

$ aws mediastore-data put-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --body Sample1_HLS.m3u8 \
    --path /awscli/Sample1_HLS_2.m3u8 \
    --content-type "application/vnd.apple.mpegurl" \
    --cache-control "max-age=1"
{
    "ContentSHA256": "1224729c047557811b3b057d993865ceXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "StorageClass": "TEMPORAL",
    "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

アップロード後にdescribe-objectコマンドで情報を取得してみると、指定の値が設定されていることが確認できます。

$ aws mediastore-data describe-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /awscli/Sample1_HLS_2.m3u8
{
    "ContentType": "application/vnd.apple.mpegurl",
    "LastModified": "Tue, 09 Jan 2018 09:46:04 GMT",
    "ContentLength": "225",
    "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "CacheControl": "max-age=1"
}

delete-object

オブジェクトを削除するコマンドです。削除するオブジェクトが含まれるコンテナのEndpoint、削除するオブジェクトへのパス情報が実行時に必要です。

  • aws mediastore-data delete-object --endpoint <value> --path <value>

先ほどput-objectコマンドでアップロードしたファイル/awscli/Sample1_HLS.m3u8を削除してみます。

$ aws mediastore-data list-items \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /awscli
{
    "Items": [
        {
            "ContentType": "binary/octet-stream",
            "Name": "Sample1_HLS.m3u8",
            "LastModified": 1515490705.812,
            "ContentLength": 225,
            "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Type": "OBJECT"
        },
        {
            "ContentType": "application/vnd.apple.mpegurl",
            "Name": "Sample1_HLS_2.m3u8",
            "LastModified": 1515491164.531,
            "ContentLength": 225,
            "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Type": "OBJECT"
        }
    ]
}
$ aws mediastore-data delete-object \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /awscli/Sample1_HLS.m3u8

コマンド実行時の出力は特にありません。list-itemsを使って/awscliフォルダのリストを取得してみると、実際にオブジェクトが削除されていることが確認できますね。

$ aws mediastore-data list-items \
    --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \
    --path /awscli
{
    "Items": [
        {
            "ContentType": "application/vnd.apple.mpegurl",
            "Name": "Sample1_HLS_2.m3u8",
            "LastModified": 1515491164.531,
            "ContentLength": 225,
            "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "Type": "OBJECT"
        }
    ]
}

まとめ

AWS Elemental MediaStoreのAWS CLIでの操作についてContainerの操作に続きObjectについても行ってみました。ObjectのAWS CLI実行にあたり個人的にハマったポイントは、--endpointでContainerのEndpointを指定する箇所になります。例えばs3apiコマンドで--bucket <バケット名>のように指定するのと同様、--container-nameみたいなオプションがあるのかなと考えていたのですが、--endpointオプションでEndpointのURLを直接指定する形式でした。ただこちらに気がついてしまえば、シンプルに使用ができるコマンド体系だなぁと感じた次第です。引き続きMedia五兄弟の他のリソースについてもAWS CLIでの操作を試してみたいと思います。