[小ネタ] AWS Elemental MediaStoreのオブジェクトをまるっと削除するAWS CLIワンライナー

AWS Media Servicesの1つでメディア向けに最適化されたストレージであるAWS Elemental MediaStoreで、格納されたオブジェクトをAWS CLIを使ったワンライナーでまるっと削除してみました。
2018.04.30

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

はじめに

清水です。AWS Media Servicesの1つでメディア向けに最適化されたストレージであり、またS3よりも強い整合性を持つという特徴も併せ持つAWS Elemental MediaStore、操作にはAWSマネージメントコンソールやAWS CLIなどが利用できます。(もちろん、APIを使った操作も可能と思います。)

AWS Elemental MediaLiveと連携させライブ配信などの検証をしていると、AWS Elemental MediaStoreのコンテナ内にオブジェクトがたくさん溜まってきます。使わなくなったオブジェクトは削除してしまえばよいのですが、現状、AWS CLIやマネージメントコンソールからの操作で複数ファイルの一括削除やワイルドカードオプションなどがありません。

となると、シェルスクリプトなどと連携させてAWS CLIで削除する必要があるな…、と考えていたところ、やはり同様の問題を抱え、解決策を考える方々がいたようで、AWSのフォーラムにてAWS CLIを使ったワンライナーが紹介されていました。

本エントリでは、このフォーラムに記載されていたAWS Elemental MediaStoreのファイルをまるっと削除するAWS CLIワンライナーの紹介と、実際にこれを使ってオブジェクトをまるっと削除してみたので、まとめてみます。

フォーラムで例示されていたAWS CLIワンライナー

こちらになります。touchoftechさんのFeb 11, 2018 9:25 AMのポストですね。

aws mediastore-data list-items --endpoint=your endpoint —path=path to files | awk ‘{system(“aws mediastore-data delete-object --endpoint=your endpoint --path=path to files"$6)}'

Where $6 is the 6th column of data output via list-items

How to delete all items (eg, empty container)?

(フォーラムの内容をそのままコピペしています。フォント違いなどもあるので、以下の実際の使用例もご参照ください。)

実際にオブジェクトをまるっと削除してみた

実際にこのワンライナーを使って、AWS Elemental MediaStoreのコンテナ内のオブジェクトをまるっと削除してみたいと思います。削除するコンテナ、オブジェクトの構成は以下のようになっていて、この内/livestreamingフォルダのオブジェクト(/livestreaming*のパスのもの)だけ削除したい、とします。

  • MSContainerA
  • /livestreamingフォルダ
  • tsファイルやm3u8ファイルがたくさん(これらをまるっと削除する)
  • /livestreaming5フォルダ
  • tsファイルやm3u8ファイルがたくさん(こちらは削除しない)

先ほどのフォーラムに例示されたワンライナーをもとに、必要な情報を加えます。またテキスト形式での出力を前提としているかと思われるので、--output textオプションを付与します。

また--pathの指定に注意しましょう。list-itemsの場合は--path=/livestreamingまたは--path=/livestreaming/と末尾の/の有無はどちらでも良いのですが、パイプでawkに渡した後、delete-objectのオプションでは--path=/livestreaming/とし、その後オブジェクト名が格納されている$6との間に、区切り文字/が入るように注意します。

実際に、以下のコマンドで/livestreamingフォルダ配下のオブジェクトをまるっと削除することができました。(オブジェクトが削除されると、最終的に/livestreamingフォルダもなくなります。)また、削除したくない/livestreaming5フォルダ配下のオブジェクトについては、もちろん残ったままです。

ワンライナーで表記すると下記になります。

aws mediastore-data list-items --endpoint=https://xxxxxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com --path=/livestreaming --output=text | awk '{system("aws mediastore-data delete-object --endpoint=https://xxxxxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com --path=/livestreaming/"$6)}'

で、ワンライナーと言いながら、個人的にはわかりやすくするように適宜\を入れて改行するのが好きです。ということで実際に実行したコマンドは以下になります。

$ aws mediastore-data list-items \
  --endpoint=https://xxxxxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com \
  --path=/livestreaming \
  --output=text \
  | awk '{system("aws mediastore-data delete-object --endpoint=https://xxxxxxxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com --path=/livestreaming/"$6)}'

aws mediastore-data delete-objectコマンドは実行後のレスポンスがないので、こちらを実行しても何も表示されません。また削除対象のオブジェクトの数により、それなり時間がかかります。(つまり何も応答なく、固まったようになります。が、きちんと削除はされています。)

まとめ

AWSフォーラムにポストされていたAWS CLIワンライナーを参考に、AWS Elemental MediaStoreのオブジェクトをまるっと削除してみました。フォーラムをきちんと読むと記載があるのですが、削除対象が1,000個以内のオブジェクトなら上手く動作するが、1,000個以上になるとNextTokenを使うなど対応が必要となるとのことです。注意しましょう。