AWS CLIでサービス固有エンドポイントを使ってMediaConvertのコマンドをシンプルに実行する!

MediaConvertをAWS CLIで操作するとき、「--endpoint-url」オプションの指定がちょっと煩雑だったりします。AWS CLIのService-specific endpointsを設定することでこれを省略してみました。
2023.07.31

はじめに

清水です。先日、AWS CLI含むAWS SDKでサービス固有エンドポイント(Service-specific endpoints)という設定が利用可能になるというアップデートがありました。以下のしばたのブログエントリで詳細を紹介しています。

AWS SDK実行時のサービスエンドポイントを環境変数または設定ファイル内のプロファイルで設定できるようになった、というアップデートです。このエンドポイントの指定にはPrivate Endpointからのサービスアクセスや独自のエンドポイントなどを想定しているのですが、私は「この機能を使えばあのサービスのコマンド、シンプルに実行できるのでは!?」と思いついたものがありました。そのサービスとはズバリ!AWS Elemental MediaConvertです。ファイルベースの動画変換サービスであるMediaConvertですが、そのAPIの実行の際にはアカウントならびにリージョン固有のendpointを指定する必要があります。

AWS CLIであれば、実行時に--endpoint-urlオプションを常に付ける必要がある、というわけですね。(このエンドポイントを確認するdescribe-endpointsコマンドだけはオプション不要ではありますが。)

AWS SDKで新たに利用可能になったService-specific endpoints(サービス固有エンドポイント)の設定を使えば、この常に付与していた--endpoint-urlオプションが不要になるのでは!?と考え、実際に確認してみました。結果、このService-specific endpointsを環境変数もしくは設定ファイル内で指定することにより、毎回付与していた--endpoint-urlが不要となることがわかりました。MediaConvertのAWS CLIコマンドをシンプルに実行する方法として以下にまとめてみたいと思います。

AWS CLIでMediaConvertコマンドを使うときにはendpointを指定する

改めてAWS CLIでAWS Elemental MediaConvert用のコマンドを実行するお作法を確認してみましょう。(詳細についてはこちらのエントリを参照ください。)

検証を行ったAWS CLI環境は以下になります。

% aws --version
aws-cli/2.13.3 Python/3.11.4 Darwin/21.6.0 exe/x86_64 prompt/off

またAWS環境として、IAMユーザー管理用アカウントとMediaConvertなど操作対象のAWSアカウントが別れた状態です。後者のAWSアカウントではIAMロールを用いて管理用アカウントのIAMロールからスイッチロールします。Jumpアカウントと呼ばれるものですね。(参考: マルチアカウントな AWS環境のマネジメントコンソールへのアクセス方法をまとめてみた | DevelopersIO

IAMロール使用の際は設定ファイル内で例えば以下のように指定します。(参考: AWS CLI で IAM ロールを使用する - AWS Command Line Interface

~/.aws/config

[profile adminaccount]
output = json
region = ap-northeast-1

[profile account.numberone]
output = json
region = ap-northeast-1
role_arn = arn:aws:iam::123456789012:role/iam-role
mfa_serial = arn:aws:iam::1111222233334444:mfa/iam-user
source_profile = adminaccount

実行時には--profileオプションを指定するぐあいですね。

% aws s3 ls --profile account.numberone
2020-06-19 02:25:10 my-s3-bucket-1
2022-04-30 01:51:30 my-s3-bucket-2
……

これは環境変数AWS_PROFILEを指定することで実行時の--profileオプションを省略することが可能です。

% export AWS_PROFILE=account.numberone
% aws s3 ls
2020-06-19 02:25:10 my-s3-bucket-1
2022-04-30 01:51:30 my-s3-bucket-2

さて、本題のMediaConvert操作用のAWS CLIコマンドです。例としてmediaconvert list-jobsコマンドを実行してみましょう。

上記のようにエラーとなってしまいますね。解決策としてはメッセージの通り、customer-specificなendpointを利用する必要があります。

% aws mediaconvert list-jobs

An error occurred (BadRequestException) when calling the ListJobs operation: You must use the customer-specific endpoint 'https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com' for this operation.

--endpoint-urlオプションでcustomer-specific endpointを指定すれば、コマンドが実行できます。

% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt' \
    --endpoint-url https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
[
    "2023-06-30T10:05:28+09:00",
    "2023-06-30T10:05:13+09:00",
    ……
    "2023-06-26T13:25:11+09:00",
    "2023-06-26T13:24:40+09:00"
]

なおこのcustomer-specific endpointは固定であるためアカウントとリージョンが同じであればハードコードもしくはキャッシュするべきである(毎回呼び出すことはAPIスロットル上限に触れてしまうため行わない)ことがAPI Referenceに記載されています。(Getting Started with AWS Elemental MediaConvert Using the AWS SDKs or the AWS CLI - AWS Elemental MediaConvert API Reference

またmediaconvert describe-endpointsコマンドについては--endpoint-urlオプションなしで実行が可能です。Outputとしてcustomer-specificなendpointが返るコマンドですね。

サービス固有エンドポイントを設定してコマンド実行時のendpoint指定を省略する

MediaConvertをAWS CLIで使う際のお作法を確認したところで、これをAWS CLI(AWS SDK)の新機能Service-specific endpointsを使うことで、どうシンプルになるのかを確認してみましょう。

環境変数を指定するパターン

まずは環境変数を指定するパターンです。AWS各サービス共通のエンドポイントを設定するAWS_ENDPOINT_URL環境変数に、先ほどのMediaConvertのcustomer-specificなendpointを指定してみます。

% export AWS_ENDPOINT_URL=https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com

これで--endpoint-urlオプションを省略してMediaConvert用AWS CLIコマンドを実行することが可能になります。

% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt'
[
    "2023-06-30T10:05:28+09:00",
    "2023-06-30T10:05:13+09:00",
    ……
    "2023-06-26T13:25:11+09:00",
    "2023-06-26T13:24:40+09:00"
]

ただし、このAWS_ENDPOINT_URLはAWS各サービス共通のエンドポイントを設定することになるため、設定したままMediaConvert以外のAWS CLIを実行しようとすると問題が生じます。

% aws s3 ls

An error occurred (403) when calling the ListBuckets operation: Forbidden

そこで、各サービス固有のエンドポイントを設定するAWS_ENDPOINT_URL_"サービス名"を使用します。こちらは以下ドキュメントに記載がありますね。(参考: AWS_ENDPOINT_URL環境変数およびプロファイル設定で使うサービス名について | DevelopersIO

MediaConvertの場合はAWS_ENDPOINT_URL_MEDIACONVERTで指定すればよいので、上記AWS_ENDPOINT_URL設定を削除した環境で以下を実行し設定します。

% export AWS_ENDPOINT_URL_MEDIACONVERT=https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com

MediaConvertのコマンド、それ以外のコマンドの双方が実行できますね。

% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt'
[
    "2023-06-30T10:05:28+09:00",
    "2023-06-30T10:05:13+09:00",
    ……
    "2023-06-26T13:25:11+09:00",
    "2023-06-26T13:24:40+09:00"
]

% aws s3 ls
2020-06-19 02:25:10 my-s3-bucket-1
2022-04-30 01:51:30 my-s3-bucket-2
……

なお、この環境下でmediaconvert describe-endpointsの実行には失敗しますが、すでにMediaConvertのcustomer-specificなendpointは確認済みであるため問題は生じない認識です。

% aws mediaconvert describe-endpoints

An error occurred (AccessDeniedException) when calling the DescribeEndpoints operation: Unable to determine service/operation name to be authorized

設定ファイル内で指定するパターン

環境変数で指定する方法を確認してきましたが、もう一つ、設定ファイル(~/.aws/config)内で設定することも可能です。こちらも確認していきましょう。(環境変数AWS_ENDPOINT_URLAWS_ENDPOINT_URL_MEDIACONVERTは削除した上で確認しています。)

環境変数AWS_ENDPOINT_URLと同様の設定が、endpoint_urlパラメータを指定することで可能です。

~/.aws/config

[profile adminaccount]
output = json
region = ap-northeast-1

[profile account.numberone]
output = json
region = ap-northeast-1
role_arn = arn:aws:iam::123456789012:role/iam-role
mfa_serial = arn:aws:iam::1111222233334444:mfa/iam-user
source_profile = adminaccount
endpoint_url = https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com

ただしこれだと先ほどと同様、MediaConvertのコマンド実行の際には--endpoint-urlは省略可能ですが、MediaConvert以外のコマンド実行に問題が発生します。

% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt'
[
    "2023-06-30T10:05:28+09:00",
    "2023-06-30T10:05:13+09:00",
    ……
    "2023-06-26T13:25:11+09:00",
    "2023-06-26T13:24:40+09:00"
]

% aws s3 ls

An error occurred (403) when calling the ListBuckets operation: Forbidden

serviceセクションを使って各サービスごとのエンドポイントを指定するとこで、MediaConvertのコマンド実行の際に--endpoint-urlを省略しつつ、MediaConvert以外のコマンドを実行させることが可能です。

~/.aws/config

[profile adminaccount]
output = json
region = ap-northeast-1

[profile account.numberone]
output = json
region = ap-northeast-1
role_arn = arn:aws:iam::123456789012:role/iam-role
mfa_serial = arn:aws:iam::1111222233334444:mfa/iam-user
source_profile = adminaccount
services = mediaconvert-for-account.numberone

[services mediaconvert-for-account.numberone]
mediaconvert =
  endpoint_url = https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt'
[
    "2023-06-30T10:05:28+09:00",
    "2023-06-30T10:05:13+09:00",
    ……
    "2023-06-26T13:25:11+09:00",
    "2023-06-26T13:24:40+09:00"
]

% aws s3 ls
2020-06-19 02:25:10 my-s3-bucket-1
2022-04-30 01:51:30 my-s3-bucket-2
……

環境変数と比べて、設定ファイルではプロファイルやリージョンごとにエンドポイントを指定できるため、複数の設定を~/.aws/configにまとめておき--profileで使い分ける、といったことが可能になるかと思います。

まとめ

AWS CLIで利用可能になったサービス固有エンドポイント(Service-specific endpoints)設定を使用することで、AWS Elemental MediaConvertのコマンドがシンプルに実行できるようになることを確認しました。MediaConvertのAWS CLI実行時には--endpoint-urlオプションが必要ですが、これをService-specific endpointsで先に設定しておくことで、実行ごとの--endpoint-urlオプションの指定が省略できます。Service-specific endpointsは環境変数もしくは設定ファイル内で指定できるので、ユースケースにあわせて使い分けましょう。またAWS各サービス共通のエンドポイントを設定すると、MediaConvert以外のサービス用コマンドの実行に問題が生じます。MediaConvertのエンドポイントのみを指定するのがよいかと思います。