AWS Elemental MediaStoreでタグベースのアクセスコントロールを試してみた

AWS Elemental MediaStoreでコンテナに付与したタグに基づくアクセス制御を試してみました。現時点でタグの付与はコンテナのみ対応しデータは非対応なこと、タグの操作はマネジメントコンソールで未対応なことに注意しましょう。
2021.06.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。メディア向けに最適化されたストレージサービスであるAWS Elemental MediaStoreでタグベースのアクセスコントロールを試してみました。MediaStoreでは2019/07の段階でコンテナへのタグ付けのサポートが発表されていました。(AWS Elemental MediaStore Now Supports Resource Tagging)ただ当時のWhat's Newに具体的な使用例として記載がなく、また私も実際に確認はできていなかったのですが、この段階ではタグベースのアクセスコントロールは未サポートだったようです。そしてMediaStoreのユーザガイドのドキュメント履歴によると、2020/11/18付けでタグベースのアクセスコントロールが可能になったとアップデートされています。タイミングとしてはre:Invent 2020直前でしたね。What's Newにも掲載がなかったようで見落としていました。

今回はそんな(個人的に見落としていた)MediaStoreのタグベースでのアクセスコントロール機能を確認してみたのでまとめてみたいと思います。リソースにタグを付与、IAM側でタグに基づいてアクセス制御を行うという点は他AWSリソースと同一かと思います。注意点としては、MediaStoreで現時点でタグ付けがサポートされているのがコンテナリソースのみであり、コンテナに格納されるデータに対してタグ付け(そしてタグベースのアクセスコントロール)がサポートされていません。またコンテナへのタグ付けやタグの確認と行った操作がマネジメントコンソールでサポートされておらず、AWS CLIやAWS SDKなどで実行する必要があります。

MediaStoreで現在サポートされているタグについて

冒頭にも記載しましたが、MediaStoreで現時点でのタグのサポート状況には少し注意が必要です。改めて本節でまとめておきます。

まずはタグ付けがサポートされているリソースです。MediaStoreではリソースはコンテナとオブジェクトに大別されます。ざっくりとS3に例えて言えば、前者はS3バケット、後者はS3バケットに入るS3オブジェクトのイメージです。MediaStoreではAPIもコンテナ用とデータ用(Data Plane)に分かれているのが特徴的かと思います。(AWS Elemental MediaStore API Reference)AWS CLIではコンテナ用がaws mediastoreコマンド、Data Plane用がaws mediastore-dataコマンド、というコマンド体系になっています。

そして、現時点でタグ付けがサポートされているリソースはコンテナのみになります。データ(Data Plane)はタグ付け未対応です。そのためタグを用いたアクセスコントロールについても、個々のオブジェクトに対して実施する、というのは現時点で不可能で、コンテナの作成や削除、そしてコンテナポリシーやCORSポリシーといった各コンテナ設定の参照や変更などの操作に限定される点に注意しましょう。

またコンテナに対するタグの操作について、付与・編集・削除などいずれの操作も現時点でAWSマネジメントコンソールではサポートされていません。そのためAWS CLIやSDKを使いAPI経由で操作する必要があります。(こちらもあくまで現時点で、ですね。例えばMediaStoreのライフサイクルポリシー設定がそうだったように、追ってAWSマネジメントコンソールで操作可能になるだろう、と思っています。([アップデート] AWS Elemental MediaStoreでオブジェクト削除のライフサイクルポリシーが設定できるようになりました! | DevelopersIO))

MediaStoreでタグベースのアクセスコントロールをしてみた

ということで、実際にMediaStoreでコンテナにタグを付与し、タグベースのアクセスコントロールを確認してみたいと思います。今回、タグ操作が現時点でAWSマネジメントコンソール非対応ということで、すべての操作をAWS CLIで行ってみました。本エントリにはマネコンのスクショは出てきません!!(確認用でマネコンは確認していましたが。)

本エントリで使用したAWS CLIはmacOS Catalina上の以下の環境となります。

% aws --version
aws-cli/2.2.14 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off

確認の流れとして、まずタグを付与したコンテナを作成します。またタグベースでのアクセス権限を持ったIAMユーザを作成、このIAMユーザからコンテナに対して参照、操作を行い、想定した通りのタグに基づいたアクセス制御ができていることを確認します。

タグを付与したコンテナの準備

まずはタグを付与したコンテナを準備します。以下2つのコンテナを、コンテナ作成時にタグを付与する方法、ならびに作成済みのコンテナにタグを付与する方法で作成します。またタグを付与したコンテナを作成後、コンテナポリシーを設定しておきます。これらの操作はMediaStoreに対してフルアクセス権限を持つIAMユーザ(ないしIAMロール)で行います。(実際はAdministratorAccess権限を持つIAMロールで行いました。)

コンテナ名 タグ1(key:value) タグ2(key:value)
blog-prd-mscontainer system:blog environment:prd
blog-dev-mscontainer system:blog environment:dev

コンテナ作成時にタグを付与する

コンテナへのタグ付与の一つ目の方法として、コンテナ作成時にタグを付与する手順を確認してみます。mediastoreのcreate-containerコマンド実行時に--tagsオプションで指定します。

% aws mediastore create-container \
    --container-name blog-prd-mscontainer \
    --tags '[{"Key": "system", "Value": "blog"}, {"Key": "environment", "Value": "prd"}]'
{
    "Container": {
        "CreationTime": "2021-06-25T20:12:47+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer",
        "Name": "blog-prd-mscontainer",
        "Status": "CREATING",
        "AccessLoggingEnabled": false
    }
}

作成直後に、describe-containerコマンドでコンテナの情報を確認してみましょう。

% aws mediastore describe-container \
    --container-name blog-prd-mscontainer
{
    "Container": {
        "CreationTime": "2021-06-25T20:12:47+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer",
        "Name": "blog-prd-mscontainer",
        "Status": "CREATING",
        "AccessLoggingEnabled": false
    }
}

describe-containerコマンドではタグの情報は確認できません。list-tags-for-resourceコマンドで確認する必要があるようです。ただし、コンテナ作成中では確認できないとのこと。

% aws mediastore list-tags-for-resource \
    --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer

An error occurred (ContainerInUseException) when calling the ListTagsForResource operation: Container must be ACTIVE in order to perform this operation.

コンテナ作成を待って(StatusがACTIVEになったら)、再度list-tags-for-resourceコマンドを実行して確認します。想定通りのタグが指定されていますね。

% aws mediastore describe-container \
    --container-name blog-prd-mscontainer
{
    "Container": {
        "Endpoint": "https://lwnpxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com",
        "CreationTime": "2021-06-25T20:12:47+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer",
        "Name": "blog-prd-mscontainer",
        "Status": "ACTIVE",
        "AccessLoggingEnabled": false
    }
}

% aws mediastore list-tags-for-resource \
    --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer
{
    "Tags": [
        {
            "Key": "environment",
            "Value": "prd"
        },
        {
            "Key": "system",
            "Value": "blog"
        }
    ]
}

作成済みのコンテナにタグを付与する

続いてコンテナへのタグ付与の二つ目の方法、、作成済みのコンテナにタグを付与するパターンです。まずコンテナをタグを付与しない状態で作成します。

% aws mediastore create-container \
    --container-name blog-dev-mscontainer \
    --profile shimizu.toshiya
{
    "Container": {
        "CreationTime": "2021-06-25T20:30:59+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer",
        "Name": "blog-dev-mscontainer",
        "Status": "CREATING",
        "AccessLoggingEnabled": false
    }
}

コンテナへのタグの付与はtag-resourceコマンドで実施します。しかしlist-tags-for-resourceコマンドがコンテナ作成中は実行できなかったのと同様に、tag-resourceコマンドも作成中は実行できずエラーとなってしまいます。

 % aws mediastore describe-container \
    --container-name blog-dev-mscontainer \
    --profile shimizu.toshiya
{
    "Container": {
        "CreationTime": "2021-06-25T20:30:59+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer",
        "Name": "blog-dev-mscontainer",
        "Status": "CREATING",
        "AccessLoggingEnabled": false
    }
}

% aws mediastore tag-resource \
    --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer \
    --tags '[{"Key": "system", "Value": "blog"}, {"Key": "environment", "Value": "dev"}]' \
    --profile shimizu.toshiya

An error occurred (ContainerInUseException) when calling the TagResource operation: Container must be ACTIVE in order to perform this operation.

コンテナが作成された後、tag-resourceコマンド実行を行いましょう。想定したタグを付与することができました。

% aws mediastore describe-container \
    --container-name blog-dev-mscontainer
{
    "Container": {
        "Endpoint": "https://2gwfxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com",
        "CreationTime": "2021-06-25T20:30:59+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer",
        "Name": "blog-dev-mscontainer",
        "Status": "ACTIVE",
        "AccessLoggingEnabled": false
    }
}

% aws mediastore list-tags-for-resource \
    --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer
    "Tags": []
}

% aws mediastore tag-resource \
    --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer \
    --tags '[{"Key": "system", "Value": "blog"}, {"Key": "environment", "Value": "dev"}]'

% aws mediastore list-tags-for-resource \
    --resource arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer
    "Tags": [
        {
            "Key": "environment",
            "Value": "dev"
        },
        {
            "Key": "system",
            "Value": "blog"
        }
    ]
}

コンテナポリシーの設定

作成した2つのタグを付与したコンテナに対し、コンテナポリシーを設定しておきます。(タグによるアクセス制御の動作確認の際、このコンテナポリシーの参照、変更を確認します。)コンテナポリシーの内容はHTTPまたはHTTPS経由のパブリック読み取りアクセスを許可するものとなります。(Example container policy: Public read access over HTTP or HTTPS - AWS Elemental MediaStore

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadOverHttpOrHttps",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "mediastore:GetObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "arn:aws:mediastore:<リージョン>:<AWSアカウントID>:container/<コンテナ名>/*"
        }
    ]
}

この内容のポリシーを作成した2つのコンテナ、blog-prd-mscontainerblog-dev-mscontainer用に作成して、ファイルblog-prd-mscontainer-policy.jsonblog-dev-mscontainer-policy.jsonに格納しておきます。

% cat blog-prd-mscontainer-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadOverHttpOrHttps",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "mediastore:GetObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer/*"
        }
    ]
}

% cat blog-dev-mscontainer-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadOverHttpOrHttps",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "mediastore:GetObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer/*"
        }
    ]
}

put-container-policyコマンドを使って、コンテナにポリシーを適用します。

% aws mediastore get-container-policy \
    --container-name blog-prd-mscontainer

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

% aws mediastore put-container-policy \
    --container-name blog-prd-mscontainer \
    --policy file://blog-prd-mscontainer-policy.json

% aws mediastore get-container-policy \
    --container-name blog-prd-mscontainer
{
    "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:ap-northeast-1:123456789012:container/blog-prd-mscontainer/*\"\n  } ]\n}"
}
% aws mediastore get-container-policy \
    --container-name blog-dev-mscontainer

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

% aws mediastore put-container-policy \
    --container-name blog-dev-mscontainer \
    --policy file://blog-dev-mscontainer-policy.json

% aws mediastore get-container-policy \
    --container-name blog-dev-mscontainer
{
    "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:ap-northeast-1:123456789012:container/blog-dev-mscontainer/*\"\n  } ]\n}"
}

以上でコンテナについては準備完了です。

タグベースでアクセスコントロールするIAMユーザの準備

タグを付与したコンテナが2つ準備できました。コンテナ名とタグについて再掲します。

コンテナ名 タグ1(key:value) タグ2(key:value)
blog-prd-mscontainer system:blog environment:prd
blog-dev-mscontainer system:blog environment:dev

続いて、これらタグを付与した2つのコンテナに対して、タグに基づいたアクセスコントロールをするIAMユーザを作成します。このIAMユーザは以下のアクセス方針とします。

  • タグsystem:blogを持つコンテナリソースに対しては参照系のアクションを許可
  • タグenvironment:devを持つコンテナリソースに対しては操作系のアクションを許可

参照系のアクションは2つのコンテナどちらにも可能だが、操作系のアクションはblog-dev-mscontainerコンテナのみ可能、というぐあいです。本番環境は設定の参照のみ、開発環境は設定の参照、変更の両方が可能、というイメージです。

タグに基づくアクセス制御にはIAMポリシー中、ConditionStringEqualsaws:ResourceTagを使って実現します。MediaStoreユーザガイドの該当箇所も参考にしましょう。(AWS Elemental MediaStore resource-based policy examples - AWS Elemental MediaStore

以下のポリシーを以下のように作成し、インラインポリシーとしてIAMユーザにアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowContainerDescribeForBlogSystem",
            "Effect": "Allow",
            "Action": [
                "mediastore:Describe*",
                "mediastore:Get*",
                "mediastore:List*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/system": "blog"
                }
            }
        },
        {
            "Sid": "AllowContainerPutDeleteForDevEnvironment",
            "Effect": "Allow",
            "Action": [
                "mediastore:Put*",
                "mediastore:Delete*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "dev"
                }
            }
        }
    ]
}

タグsystem:blogを持つコンテナリソース(つまり先ほど作成した2つのコンテナ)に対しては、参照系のアクション(Describe*Get*List*)が実行可能です。またタグenvironment:devを持つコンテナリソースに対しては、操作系のアクション(Put*Delete*)を実行可能、としています。

なお、MediaStoreのコンテナ操作APIには他にもStartAccessLoggingStopAccessLoggingTagResourceUntagResourceといった上記に合致しないものも存在します。厳密にコンテナに対する操作系のアクションを許可する場合はこれらも追加する必要がありますが、本エントリでは割愛します。詳細についてはMediaStore APIドキュメントなどを参照ください。

IAMユーザ作成後、認証情報としてアクセスキー、シークレットキーを発行してAWS CLIで利用できるように準備しておきます。

タグベースのアクセスコントロールができていることの確認

コンテナblog-dev-mscontainerの参照・操作

タグを付与したコンテナ、ならびにそのタグに基づいてアクセス制御されたIAMユーザの準備ができました。それでは実際に、タグベースのアクセスコントロールができることを確認していきます。以降、AWS CLIコマンド実行は先ほど作成したIAMユーザで行います。

まずはコンテナblog-dev-mscontainerに対しての操作です。参照系と操作系のAPIが許可されているはずですね。まずはコンテナ情報、ならびにコンテナポリシー情報を取得してみます。

% aws mediastore describe-container \
    --container-name blog-dev-mscontainer
{
    "Container": {
        "Endpoint": "https://2gwfxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com",
        "CreationTime": "2021-06-25T20:30:59+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer",
        "Name": "blog-dev-mscontainer",
        "Status": "ACTIVE",
        "AccessLoggingEnabled": false
    }
}
% aws mediastore get-container-policy \
    --container-name blog-dev-mscontainer
{
    "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:ap-northeast-1:123456789012:container/blog-dev-mscontainer/*\"\n  } ]\n}"
}

問題なくdescribe-containerコマンド、get-cotainer-policyコマンドが実行できました。続いて操作系のAPIの実行として、コンテナポリシーを変更してみます。変更するコンテナポリシーの内容は以下です。先ほど設定したHTTP/HTTPS経由のパブリック読み取りアクセス許可の設定から、CDN認証用のコンテナポリシーに変更する、というぐあいですね。(AWS Elemental MediaStoreでCDN認証してオリジン保護してみた | DevelopersIO

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid" : "CloudFrontRead",
            "Effect" : "Allow",
            "Principal" : "*",
            "Action" : [
                "mediastore:GetObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "arn:aws:mediastore:<リージョン>:<AWSアカウントID>:container/<コンテナ名>/*"
            "Condition" : {
                "StringEquals" : {
                    "aws:UserAgent" : "<認証コード>"
                },
                "Bool" : {
                    "aws:SecureTransport" : "true"
                }
            }

        }
    ]
}

これをコンテナblog-dev-mscontainer用に設定したものをファイルblog-dev-mscontainer-policy2.jsonに格納しておきます。認証コードはsesame-ouvre-toiとしました。

% cat blog-dev-mscontainer-policy2.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid" : "CloudFrontRead",
            "Effect" : "Allow",
            "Principal" : "*",
            "Action" : [
                "mediastore:GetObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer/*",
            "Condition" : {
                "StringEquals" : {
                    "aws:UserAgent" : "sesame-ouvre-toi"
                },
                "Bool" : {
                    "aws:SecureTransport" : "true"
                }
            }

        }
    ]
}

このファイルを--policyオプションの引数として、put-container-policyコマンドを実行してみます。問題なく設定できていることが確認できますね。

% aws mediastore get-container-policy \
    --container-name blog-dev-mscontainer
{
    "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:ap-northeast-1:123456789012:container/blog-dev-mscontainer/*\"\n  } ]\n}"
}

% aws mediastore put-container-policy \
    --container-name blog-dev-mscontainer \
    --policy file://blog-dev-mscontainer-policy2.json

% aws mediastore get-container-policy \
    --container-name blog-dev-mscontainer
{
    "Policy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [ {\n    \"Sid\" : \"CloudFrontRead\",\n    \"Effect\" : \"Allow\",\n    \"Principal\" : \"*\",\n    \"Action\" : [ \"mediastore:GetObject\", \"mediastore:DescribeObject\" ],\n    \"Resource\" : \"arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-dev-mscontainer/*\",\n    \"Condition\" : {\n      \"StringEquals\" : {\n        \"aws:UserAgent\" : \"sesame-ouvre-toi\"\n      },\n      \"Bool\" : {\n        \"aws:SecureTransport\" : \"true\"\n      }\n    }\n  } ]\n}"
}

コンテナblog-prd-mscontainerの参照・操作

続いてコンテナblog-prd-mscontainerへの参照・操作についても確認してみます。参照系のAPIのみ許可されており、操作系について(暗黙のDenyにより)禁止されている、という状況です。まずは参照系としてコンテナ情報、コンテナポリシー情報を取得してみましょう。こちらは問題なくdescribe-containerget-cotainer-policyの両コマンド実行ができました。

% aws mediastore describe-container \
    --container-name blog-prd-mscontainer
{
    "Container": {
        "Endpoint": "https://lwnpxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com",
        "CreationTime": "2021-06-25T20:12:47+09:00",
        "ARN": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer",
        "Name": "blog-prd-mscontainer",
        "Status": "ACTIVE",
        "AccessLoggingEnabled": false
    }
}
% aws mediastore get-container-policy \
    --container-name blog-prd-mscontainer
{
    "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:ap-northeast-1:123456789012:container/blog-prd-mscontainer/*\"\n  } ]\n}"
}

続いて操作系コマンドとして先ほどのblog-dev-mscontainerと同様、コンテナポリシーの変更を試してみます。設定を試みるコンテナポリシーの内容も先ほどと同様、CDN認証用のものを準備しました。blog-prd-mscontainer-policy2.jsonというファイルに格納しておきます。

% cat blog-prd-mscontainer-policy2.json                                        {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid" : "CloudFrontRead",
            "Effect" : "Allow",
            "Principal" : "*",
            "Action" : [
                "mediastore:GetObject",
                "mediastore:DescribeObject"
            ],
            "Resource": "arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer/*",
            "Condition" : {
                "StringEquals" : {
                    "aws:UserAgent" : "sesame-ouvre-toi"
                },
                "Bool" : {
                    "aws:SecureTransport" : "true"
                }
            }

        }
    ]
}

このファイルを--policyオプションの引数として、put-container-policyコマンドを実行してみます。先ほどのblog-dev-mscontainerに対する操作と異なり、blog-prd-mscontainerに対してはput-container-policyコマンドが失敗する、という結果となりました。タグベースのアクセスコントロールが想定通りに動作していることが確認できましたね。

% aws mediastore get-container-policy \
    --container-name blog-prd-mscontainer
{
    "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:ap-northeast-1:123456789012:container/blog-prd-mscontainer/*\"\n  } ]\n}"
}

% aws mediastore put-container-policy \
    --container-name blog-prd-mscontainer \
    --policy file://blog-prd-mscontainer-policy2.json

An error occurred (AccessDeniedException) when calling the PutContainerPolicy operation: User: arn:aws:iam::123456789012:user/dev-env-user is not authorized to perform: mediastore:PutContainerPolicy on resource: arn:aws:mediastore:ap-northeast-1:123456789012:container/blog-prd-mscontainer

まとめ

AWS Elemental MediaStoreでタグに基づくアクセスコントロールを試してみました。現時点でタグ付けがサポートされているのがコンテナリソースのみですので、タグベースのアクセスコントロールもコンテナ操作のみが対象となります。またこちらも現時点では、AWSマネジメントコンソールからのMediaStoreコンテナへのタグ操作がサポートされていないため、AWS CLIやSDKなどでタグ操作が必要になります。これらの点を踏まえておけば、他AWSリソースと同様なタグ利用によるアクセス制御ができるかと思います。