この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
清水です。re:Invent 2017でリリースされたMedia五兄弟こと(?)AWS Media Services、本エントリではメディア最適化ストレージであるAWS Elemental MediaStoreについてAWS CLIで操作してみました。先に公開した以下のContainer操作系コマンド編に続き、Object操作系コマンドmediastore-dataについても触ってみたので本エントリにまとめてみます。
やってみた
オブジェクト操作系のコマンドは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での操作を試してみたいと思います。