AWS CLIでS3へオブジェクトを登録→署名付きURLを取得したかった話。

# 導入

「大容量ファイルの共有か～。」
「色々サービスはあるみたいだけど、わざわざ新しく共有するのもな～。」
「出来る限り簡単かつセキュアにしたいな～。」

・
・
・

「S3でいいじゃん！」

ということでバッチサンプル作成してみました。

# 前提

* 転送元： AWS EC2インスタンス (Windows系)
* 転送先： AWS S3

※EC2インスタンスには、対象S3バケットへのアクセス許可を与えています。

# コード

``` hoge.bat
@echo off
setlocal ENABLEDELAYEDEXPANSION

pushd %0\..
cls

rem # --------------------------------------------------------------------------
rem # Set
rem # --------------------------------------------------------------------------

rem # ----------------------------------
rem # Common
rem # ----------------------------------
title %0
set mypath=%~dp0
set mypath=%mypath:~0,-1%
set dt=%date:~-10%
set tm=%time: =0%
set yyyymmdd=%dt:~0,4%%dt:~5,2%%dt:~8,2%%tm:~0,2%%tm:~3,2%%tm:~6,2%
set outputfolder=result_%yyyymmdd%
set outputfolderpath=%mypath%\%outputfolder%
set logfile=result_%yyyymmdd%.log
set logfilepath=%outputfolderpath%\%logfile%

rem # ----------------------------------
rem # 重要設定
rem # 対象ファイルパス
rem # 例: filepath="C:\Users\hoge.zip"
rem # ----------------------------------
set dirpath={dirpath}
set filename={filename}
set filepath=%dirpath%\%filename%

rem # ----------------------------------
rem # S3
rem # 例: s3backetname=fuga
rem # ----------------------------------
set s3backetname={backetname}

rem # --------------------------------------------------------------------------
rem # Program Start
rem # --------------------------------------------------------------------------
IF ""%filepath%""=="""" (
  echo 対象ファイルを設定してください。
  pause
  exit /b
)

IF ""%s3backetname%""=="""" (
  echo S3バケット名を設定してください。
  pause
  exit /b
)

SET /P ANSWER="file: %filepath% を %s3backetname% へ転送します。 (Y/N)?"

IF /i not ""%ANSWER%""==""y"" (
  echo 処理を終了します。
  pause
  exit /b
)

rem # ----------------------------------
rem # Create Output Folder
rem # ----------------------------------
md %outputfolderpath%

rem # ----------------------------------
rem # Send S3
rem # ----------------------------------
echo .
echo backet name: %s3backetname%
echo backet name: %s3backetname%>> "%logfilepath%"
echo file path: %filepath%
echo file path: %filepath%>> "%logfilepath%"
aws s3 cp "%filepath%" "s3://%s3backetname%/%filename%"
set S3ERROR=!errorlevel!
if %S3ERROR% equ 0 (
  echo .
  echo CORRECT Send S3
) else (
  echo .
  echo FAILURE Send S3 ReturnCode:%S3ERROR%
  echo.>> "%logfilepath%"
  echo [%DATE% %TIME%] FAILURE Send S3 ReturnCode:%S3ERROR%>> "%logfilepath%"
  pause
  exit /b
)

rem # ----------------------------------
rem # Get S3 URL
rem # ----------------------------------
echo.>> "%logfilepath%"
echo Get URL Result >> "%logfilepath%"
aws s3 presign "s3://%s3backetname%/%filename%" --expires-in 259200 >> "%logfilepath%"
```

## ポイント

`aws s3 presign {オブジェクト名} --expires-in 259200`

上記で署名付きURLを発行しています。
オプションの`--expires-in {秒数}`でURLの有効期限の設定も可能です。

今回は259200秒なので3日です。
設定できる上限が認証によって変わるようなのでその点は注意が必要ですね。(2021/04/02時点)

| 認証 | 設定可能時間 | 備考 |
|:-----------|:------------|:------------|
| IAM インスタンスプロファイル|最大 6 時間有効||
| AWS Security Token Service|最大 36 時間有効|AWS アカウントルートユーザーや IAM ユーザーの認証情報など、永続的認証情報を使用して署名した場合|
| IAM ユーザー|最大 7 日間有効|AWS 署名バージョン 4 を使用した場合|

# ということで

「なんとかなりそう(^^)」で今回は終話。

# 参考文献

* [署名付き URL を使用したオブジェクトの共有](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)
* [AWS CLI Command Reference - presign](https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html)
* [AWS CLI Command Reference - cp](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html)
* [AWS CLI での高レベル (S3) コマンドの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html)

# 注意

AWS コマンドラインインターフェイスのインストールについては[公式ドキュメント](https://aws.amazon.com/jp/cli/)を参照ください。