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

はじめに

清水です。re:Invent 2017でリリースされたMedia五兄弟こと(?)AWS Media Services、本エントリではメディア最適化ストレージであるAWS Elemental MediaStoreについてAWS CLIで操作してみました。AWS Elemental MediaStoreを操作するAWS CLIのコマンド群は、(1) Containerを操作するaws mediastoreで始まるコマンド、(2) Objectを操作するaws mediastore-dataで始まるコマンドの2種類にわけることができます。本エントリではContainerを操作するmediastoreコマンドについてまとめてみます。なおObjectを操作するmediastore-dataコマンドは下記のエントリにまとめましたので合わせてご参照ください。

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

やってみた

AWS Elemental MediaStoreのContainerを操作するmediastoreコマンドは以下の7つが用意されています。(mediastore — AWS CLI Command Reference

  • create-container
  • delete-container
  • delete-container-policy
  • describe-container
  • get-container-policy
  • list-containers
  • put-container-policy

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

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

list-containers

コンテナを一覧表示するコマンドです。引数なしで実行してみました。(出力数が多くなる場合などは引数で調整ができるようです。)

  • aws mediastore list-containers

Status、Endpoint、CreationTime(Unix timestamp)、コンテナ名、ARNの情報がコンテナ毎に一覧表示されます。

 $ aws mediastore list-containers
{
    "Containers": [
        {
            "Status": "ACTIVE",
            "Endpoint": "https://lloztyXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463352.0,
            "Name": "MediaStoreContainerA",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerA"
        },
        {
            "Status": "ACTIVE",
            "Endpoint": "https://npt5opXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463371.0,
            "Name": "MediaStoreContainerB",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerB"
        }
    ]
}

describe-container

コンテナ名を指定して、そのコンテナの詳細情報を取得するコマンドです。--container-nameでコンテナ名を指定します。

  • aws mediastore describe-container --container-name <value>

取得できる情報はStatsu、Endpoint、CreationTime、Name、ARNとlist-containersと同じ内容ののようです。

 $ aws mediastore describe-container --container-name MediaStoreContainerA
{
    "Container": {
        "Status": "ACTIVE",
        "Endpoint": "https://lloztyXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
        "CreationTime": 1515463352.0,
        "Name": "MediaStoreContainerA",
        "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerA"
    }
}

create-container

コンテナを作成するコマンドです。書式は下記の通り、コンテナ名を引数に取ります。

  • aws mediastore create-container --container-name <value>

実行すると、以下のようにStatus、CreationTime、コンテナ名、ARNが返ってきます。Statusはコマンド実行時、またその後のdescribe-containerでもしばらくは"CREATING"状態ですが、作成が完了すれば"ACTIVE"となります。

 $ aws mediastore create-container --container-name MediaStoreContainer1
{
    "Container": {
        "Status": "CREATING",
        "CreationTime": 1515464148.0,
        "Name": "MediaStoreContainer1",
        "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1"
    }
}
 $ aws mediastore describe-container --container-name MediaStoreContainer1
{
    "Container": {
        "Status": "CREATING",
        "CreationTime": 1515464148.0,
        "Name": "MediaStoreContainer1",
        "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1"
    }
}
 $ aws mediastore describe-container --container-name MediaStoreContainer1
{
    "Container": {
        "Status": "ACTIVE",
        "Endpoint": "https://h6rjgfXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
        "CreationTime": 1515464148.0,
        "Name": "MediaStoreContainer1",
        "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1"
    }
}

get-container-policy

コンテナに設定されているアクセスポリシーを取得するコマンドです。書式は下記の通り、コンテナ名を引数に取ります。

  • aws mediastore get-container-policy --container-name <value>

出力は下記のように、アクセスポリシーとなるJSONが返ります。

 $ aws mediastore get-container-policy --container-name MediaStoreContainerA
{
    "Policy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [ {\n    \"Sid\" : \"PublicReadOverHttpOrHttps\",\n    \"Effect\" : \"Allow\",\n    \"Principal\" : \"*\",\n    \"Action\" : [ \"mediastore:GetObject\", \"mediastore:DescribeObject\" ],\n    \"Resource\" : \"arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerA/*\",\n    \"Condition\" : {\n      \"Bool\" : {\n        \"aws:SecureTransport\" : [ \"true\", \"false\" ]\n      }\n    }\n  } ]\n}"
}

またアクセスポリシーが設定されていない状態(=デフォルトのアクセスポリシーが適用されている状態)では、下記のようにエラーが返りました。

 $ aws mediastore get-container-policy --container-name MediaStoreContaineB

An error occurred (ContainerNotFoundException) when calling the GetContainerPolicy operation:

put-container-policy

コンテナにアクセスポリシーを設定するコマンドです。下記のようにコンテナ名とポリシーを引数として実行します。

  • aws mediastore put-container-policy --container-name <value> --policy <value>

ポリシー例についてはユーザーガイドにいくつかサンプルがあります。

今回はポリシー例としてPublic Read Access over HTTPSを参照しました。

 $ cat MediaStoreContainer1Policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadOverHttps",
            "Action": ["mediastore:GetObject", "mediastore:DescribeObject"],
            "Principal": "*",
            "Effect": "Allow",
            "Resource" : "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1/*",
            "Condition": {
                "Bool": { "aws:SecureTransport": "true" }
            }
        }
    ]
}

実行時の出力は特にありません。get-container-poilcyコマンドでポリシー内容を確認しましょう。またポリシーの指定にはfile://を使ってJSON形式のファイルを指定することができました。

$ aws mediastore put-container-policy --container-name MediaStoreContainer1 \
    --policy file://MediaStoreContainer1Policy.json
 $ aws mediastore get-container-policy --container-name MediaStoreContainer1
{
    "Policy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [ {\n    \"Sid\" : \"PublicReadOverHttps\",\n    \"Effect\" : \"Allow\",\n    \"Principal\" : \"*\",\n    \"Action\" : [ \"mediastore:GetObject\", \"mediastore:DescribeObject\" ],\n    \"Resource\" : \"arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1/*\",\n    \"Condition\" : {\n      \"Bool\" : {\n        \"aws:SecureTransport\" : \"true\"\n      }\n    }\n  } ]\n}"
}

delete-container-policy

コンテナに設定しているアクセスポリシーを削除するコマンドです。対象となるコンテナ名を引数にとります。

aws mediastore delete-container-policy --container-name <value>

実行時の出力は特にありませんので、実行前後でget-container-policyコマンドを使って状態を確認しましょう。

 $ aws mediastore get-container-policy --container-name MediaStoreContainer1
{
    "Policy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [ {\n    \"Sid\" : \"PublicReadOverHttps\",\n    \"Effect\" : \"Allow\",\n    \"Principal\" : \"*\",\n    \"Action\" : [ \"mediastore:GetObject\", \"mediastore:DescribeObject\" ],\n    \"Resource\" : \"arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1/*\",\n    \"Condition\" : {\n      \"Bool\" : {\n        \"aws:SecureTransport\" : \"true\"\n      }\n    }\n  } ]\n}"
}
 $ aws mediastore delete-container-policy --container-name MediaStoreContainer1
 
 $ aws mediastore get-container-policy --container-name MediaStoreContainer1

An error occurred (PolicyNotFoundException) when calling the GetContainerPolicy operation:

delete-container

コンテナを削除するコマンドです。対象となるコンテナ名を引数にとります。またコンテナが空(=中にオブジェクトが入っていない状態)でないと削除はできません。)

  • aws mediastore delete-container --container-name <value>

コンテナ内にオブジェクトがある状態だと、以下のようにエラーとなりました。

 $ aws mediastore delete-container --container-name MediaStoreContainer1

An error occurred (ContainerInUseException) when calling the DeleteContainer operation:

コンテナの中身を空にして、コマンドを実行してみます。実行時の出力は特にありませんが、実行後にlist-containersコマンドを実行すると対象コンテナのStatusが"DELETEING"になり、しらばらくすると削除されたこと(=一覧に表示されないこと)が確認できました。

 $ aws mediastore list-containers
{
    "Containers": [
        {
            "Status": "ACTIVE",
            "Endpoint": "https://h6rjgfXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515464148.0,
            "Name": "MediaStoreContainer1",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1"
        },
        {
            "Status": "ACTIVE",
            "Endpoint": "https://lloztyXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463352.0,
            "Name": "MediaStoreContainerA",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerA"
        },
        {
            "Status": "ACTIVE",
            "Endpoint": "https://npt5opXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463371.0,
            "Name": "MediaStoreContainerB",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerB"
        }
    ]
}
 $ aws mediastore delete-container --container-name MediaStoreContainer1
 $ aws mediastore list-containers
{
    "Containers": [
        {
            "Status": "DELETING",
            "CreationTime": 1515464148.0,
            "Name": "MediaStoreContainer1",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainer1"
        },
        {
            "Status": "ACTIVE",
            "Endpoint": "https://lloztyXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463352.0,
            "Name": "MediaStoreContainerA",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerA"
        },
        {
            "Status": "ACTIVE",
            "Endpoint": "https://npt5opXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463371.0,
            "Name": "MediaStoreContainerB",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerB"
        }
    ]
}
 $ aws mediastore list-containers
{
    "Containers": [
        {
            "Status": "ACTIVE",
            "Endpoint": "https://lloztyXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463352.0,
            "Name": "MediaStoreContainerA",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerA"
        },
        {
            "Status": "ACTIVE",
            "Endpoint": "https://npt5opXXXXXXXX.data.mediastore.us-east-1.amazonaws.com",
            "CreationTime": 1515463371.0,
            "Name": "MediaStoreContainerB",
            "ARN": "arn:aws:mediastore:us-east-1:[AWS-Account-ID]:container/MediaStoreContainerB"
        }
    ]
}

まとめ

AWS Elemental MediaStoreでContainerの操作をAWS CLIから行ってみました。Containerの操作についてはAWS CLIのドキュメント *1にも「Amazon S3のBucketと似ている」という記述がある通り、S3 Bucketの操作に似たイメージで行うことができた、という印象です。引き続きMediaStoreのObject操作についてもAWS CLIから行ってみたいと思います。(Object操作については下記エントリにまとめましたので、合わせてご参照ください。)

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

脚注

  1. 例えばcreate-containerのDescriptionに"A container is similar to a bucket in the Amazon S3 service."という記載があります。