S3 のファイルを HTTP で取得するコマンドを作った

Aws::SSM::Client#get_command_invocation の返り値には standard_output_url, standard_error_url が含まれているんですが、いちいち s3:// の URI に変換して aws s3 cp s3://... - で確認するのも辛いので、URL をそのまま指定すればオブジェクトの内容を出力するコマンドを作りました。

https://github.com/abicky/s3-http-get

% gem install s3-http-get
% s3-http-get -h
Usage: s3-http-get [options] URL
        --profile PROFILE            Use a specific profile from your credential file.
% echo Hello > hello.txt
% aws s3 cp hello.txt s3://s3-test.abicky.net/
upload: ./hello.txt to s3://s3-test.abicky.net/hello.txt
% s3-http-get https://s3-ap-northeast-1.amazonaws.com/test.abicky.net/hello.txt
Hello

AWS CLI 同様、次の優先順位で使用するアカウントが決定されます。

  1. AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 環境変数
  2. --profile オプション
  3. AWS_PROFILE 環境変数

Amazon S3 REST API を使うにあたって、Authorization header を付与しているんですが、Aws::Sigv4::Signer#sign_request が必要なヘッダ情報を生成してくれるので、一番面倒だったのは URL から regoin 情報を抽出することでした。

なお、これを作ったきっかけは、standard_error_url は S3 のパスからコロンが除かれたものになっており、単純に aws s3 s3://... に変換するだけだとオブジェクトにアクセスできなかったからなんですが、HTTP でアクセスするにしてもコロンは必要みたいです…。