AWS Elemental MediaConvertで入力ロケーションを制限してみた

AWS Elemental MediaConvertで入力ソースのロケーションを制限できるポリシーを設定できるようになりました。S3/HTTPS/HTTPそれぞれに対して、許可もしくは禁止が設定できます。実際に設定して試してみました。
2021.10.25

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

はじめに

清水です。AWS Media Servicesの細かなアップデートを追っていくコーナーです。本エントリで紹介するのはこちら、AWS Elemental MediaConvertで入力ローケーションをポリシーを使って制御できるようになりました。2021/10/08付でAPIならびにドキュメントが更新されています。

AWS re:Invet 2017期間中(2017年11月下旬)にAWS Media Servicesの1つとしてリリースされたAWS Elemental MediaConvert、リリース当時はそれ以前からあったAWSの動画変換サービスAmazon Elastic Transcoderと同じく、入力/出力ともAmazon S3であるという仕様でした。

その後2019年夏にMediaConvertのアップデートとして、HTTPS/HTTPの入力ソースに対応しました。変換したい元ファイル(元の映像ソース)がAWS、S3の外にある場合など、それまではいちどS3にコピーする必要がありましたが、直接MediaConvertの入力ソースとすることが可能になりました。

MediaConvetの入力ソースはS3/HTTPS/HTTPの3種をサポートしているのが現在の状況です。今回のアップデートではこの3種の入力ソースについて、各々を使用するかしないかの制御ができるようになりました。例えば、入力ソースにHTTPは使用したくないのでS3とHTTPSのみを有効にする、従来と同じように入力ソースはS3のみからとする(HTTPSとHTTPは入力ソースとして使用しないよう制限する)、といったことが可能です。

設定についてはポリシーを作成して、AWSアカウント内のリージョン単位で適用します。2021/10/25現在のところAWSマネジメントコンソールからの設定はサポートしておらず、APIもしくはAWS CLIからの操作となります。本エントリでは実際にAWS CLIでこのポリシーを設定、動作を確認してみたのでまとめてみます。

MediaConvertのポリシーで入力ソースを制限してみた

それでは実際にMediaConvertにポリシーを適用し、入力ソースを制限してみたいと思います。ポリシーの操作は以下環境のAWS CLIで実行しました。

% aws --version
aws-cli/2.3.0 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off

MediaConvertのendpointの確認

MediaConvertをAPI(含むAWS CLI)で操作する場合、アカウント個別のendpointを指定する必要があります。

事前にこちらを確認しておきましょう。aws mediaconvert describe-endpointsを使用します。

% aws mediaconvert describe-endpoints \
  --region ap-northeast-1
{
    "Endpoints": [
        {
            "Url": "https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com"
        }
    ]
}

Urlの値となっているのがendpointです。以降、AWS CLI実行時にこちらのendpointを--endpoint-urlオプションで指定していきます。

MediaConvertポリシーの設定状況の確認

MediaConvertにポリシーを設定する前に、まずはポリシーの状態を確認しておきましょう。といってもなにも設定していなければポリシーは空の状態です。aws mediaconvert get-policyコマンドを実行してみます。

% aws mediaconvert get-policy \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com

An error occurred (NotFoundException) when calling the GetPolicy operation: Your account does not have a policy.

エラーメッセージとともに、ポリシーが空であることがわかりました。

HTTP入力を禁止してみる

では実際にMediaConvertにポリシーを設定し、入力ソースの種別を制限していきます。まずは3つの入力ソース種別のうち、HTTPを禁止するポリシーを設定してみます。ポリシーの設定にはaws mediaconvert put-policyコマンドを使用します。ポリシーについては、--policyオプションに続いてJSON形式で記述します。

ポリシーは以下の形式で、3つの要素S3InputsHttpsInputsHttpInputsに対して、ALLOWEDもしくはDISALLOWEDを指定します。

{
  "S3Inputs": "ALLOWED|DISALLOWED",
  "HttpsInputs": "ALLOWED|DISALLOWED",
  "HttpInputs": "ALLOWED|DISALLOWED"
}

実際に実行してみます。put-policyコマンドの返り値としては実際に設定されたポリシーが返ります。

% aws mediaconvert put-policy \
  --policy '{"S3Inputs":"ALLOWED", "HttpsInputs":"ALLOWED", "HttpInputs":"DISALLOWED"}' \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
{
    "Policy": {
        "HttpInputs": "DISALLOWED",
        "HttpsInputs": "ALLOWED",
        "S3Inputs": "ALLOWED"
    }
}

この状態でget-policyコマンドでポリシーを確認してみます。

% aws mediaconvert get-policy \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
{
    "Policy": {
        "HttpInputs": "DISALLOWED",
        "HttpsInputs": "ALLOWED",
        "S3Inputs": "ALLOWED"
    }
}

ポリシーが設定されていますね。この状態で入力ソースをHTTPとしてジョブを作成しようとしてみます。AWSマネジメントコンソールからCreate jobで[Create]ボタンを押してみましたが、以下のように「You specified an input location that your policy disallows. Specify an allowed input location and resubmit your job.」というメッセージが表れ、ジョブの作成ができませんでした。きちんとHTTPの入力が制限されていますね。

S3入力を禁止してみる

続いてはS3を入力ソースとして使用することを禁止してみたいと思います。(実際にこれはレアなケースだとは思いますが、検証ということで。)以下のようにS3InputsDISALLOWEDHttpsInputsHttpInputsALLOWEDとしたJSONを指定してput-policyコマンドを実行します。

% aws mediaconvert put-policy \
  --policy '{"S3Inputs":"DISALLOWED", "HttpsInputs":"ALLOWED", "HttpInputs":"ALLOWED"}' \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
{
    "Policy": {
        "HttpInputs": "ALLOWED",
        "HttpsInputs": "ALLOWED",
        "S3Inputs": "DISALLOWED"
    }
}

get-policyコマンドで設定状態を確認します。S3の入力が禁止されている状態ですね。

% aws mediaconvert get-policy \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
{
    "Policy": {
        "HttpInputs": "ALLOWED",
        "HttpsInputs": "ALLOWED",
        "S3Inputs": "DISALLOWED"
    }
}

この状態で、入力ソースをS3に指定したジョブを作成しようとすると、先ほどと同じように「You specified an input location that your policy disallows. Specify an allowed input location and resubmit your job.」のメッセージでジョブの作成ができません。

ただしS3については、オブジェクトを公開状態にしていればHTTPS/HTTPでのアクセスも可能ですね。例えばs3://でS3 URIの形式で入力ソースを指定するのではなく、https://ではじまるObject URL(ドメイン名が[バケット名].s3.ap-northeast-1.amazonaws.comのもの)を使用すれば、ジョブの作成が可能になります。これはMediaConvert側からはS3ではなくHTTPSの入力ソースとして見ているわけですね。(入力ソースをS3とする(s3://で指定する)場合は、MediaConvertのジョブに設定したIAMロールでアクセスするなどの条件が異なるのかな、などと推測しています。)

MediaConvertのポリシーを削除する

最後に、今回設定したMediaConvertのポリシーを削除しておきます。削除はaws mediaconvert delete-policyコマンドで実行します。

コマンド実行時の返り値は特にありません。

% aws mediaconvert delete-policy \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com

実行後は、ポリシーが空になっているか確認しておきましょう。

% aws mediaconvert get-policy \
  --region ap-northeast-1 \
  --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com

An error occurred (NotFoundException) when calling the GetPolicy operation: Your account does not have a policy.

まとめ

AWS Elemental MediaConvertでポリシーを設定して入力ソースのロケーションを制限してみました。S3以外の入力ソースが使えるアップデートも大変うれしいアップデートでしたが、今回はそれにあえて制限ができるようになるという、かゆいところに手が届くというか、非常に設定の柔軟性をもたらしてくれるアップデートだなと思いました。実際の使用例としては、暗号化されていないHTTPを禁止しておいたり、HTTPS/HTTP双方を禁止して(従来のような)S3からの入力に限定したり、といったケースかなと思います。適用はAWSアカウント内のリージョン単位での適用になる点には注意しましょう。