PowerShellでAWS S3にアクセス

　Microsoftの製品だからと毛嫌いされているのか、あまり使われていない印象のあるPowerShell……。慣れてしまえば非常に快適だと思うんですけどね。この記事では、AWS Tools for Windows PowerShellでS3を扱う方法をチュートリアル風に書いています。

　AWS Tools for Windows PowerShellのインストールについては[公式の説明](http://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html#pstools-getting-set-up)か、[PowerShellでAWS](http://qiita.com/yshn010/items/9be26434705afcc1d45c)に書かれていますので、すでにインストールが済んでいることを前提にします。

# S3バケットの作成・取得

　バケットを作成します。

```
PS C:\> New-S3Bucket -BucketName bucket00rtyhjkjjk -Region ap-northeast-1

CreationDate       BucketName
------------       ----------
2017/01/29 0:01:54 bucket00rtyhjkjjk


PS C:\>
```

　バケット一覧（配列）を取得して変数に格納し、画面に表示します。

```
PS C:\> $s3buckets = Get-S3Bucket
PS C:\>
PS C:\> $s3buckets

CreationDate        BucketName
------------        ----------
2016/12/02 19:36:19 artyhjkjjk
2017/01/29 9:01:56  bucket00rtyhjkjjk
（略）
PS C:\>
```

　0起算で1番目のバケットを表示します。

```
PS C:\> $s3buckets[1]

CreationDate       BucketName
------------       ----------
2017/01/29 0:01:54 bucket00rtyhjkjjk


PS C:\>
```

　PowerShellコマンドレットは、結果が複数であれば自動的に配列に格納されるという仕様があるので、上記では`$s3buckets[1]`と書いていますが、`$s3buckets`に格納されているバケットが1つだけであれば、`$s3buckets[1]`のような添え字をつけずに`$s3buckets`と書くだけで上記のような結果が得られます。バケットが1つだけの場合、この後の`$s3buckets[1]`は`$s3buckets`と読み替えてください。

　バケット名だけを表示します。

```
PS C:\> $s3buckets[1].BucketName
bucket00rtyhjkjjk
PS C:\>
```

# S3オブジェクトのアップロード・ダウンロード・削除

　ローカル（Windows 10）の`ドキュメント\s3`フォルダーの中にあるファイルを、先ほどのバケットの`folder1/`フォルダーにアップロードします。

```
PS C:\> Write-S3Object -BucketName $s3buckets[1].BucketName -Folder ($HOME + '\Documents\s3\') -KeyPrefix folder1/
PS C:\>
```

　キーのプレフィックスを指定してオブジェクトの一覧を変数に格納し、表示します。

```
PS C:\> $s3objects = Get-S3Object -BucketName $s3buckets[1].BucketName -KeyPrefix 'folder1/'
PS C:\>
PS C:\> $s3objects


ETag         : "7d26477a9093369734740028efcf997a"
BucketName   : bucket00rtyhjkjjk
Key          : folder1/file0.txt
LastModified : 2017/01/29 11:04:12
Owner        : Amazon.S3.Model.Owner
Size         : 20
StorageClass : STANDARD

ETag         : "6655e9f884b346e54bedd6e2e8f17030"
BucketName   : bucket00rtyhjkjjk
Key          : folder1/file1.jpg
LastModified : 2017/01/29 11:04:12
Owner        : Amazon.S3.Model.Owner
Size         : 56648
StorageClass : STANDARD



PS C:\>
```

　今見たいのはKeyだけなのでKeyだけ表示します。

```
PS C:\> $s3objects | Select-Object Key

Key
---
folder1/file0.txt
folder1/file1.jpg


PS C:\>
```

　表示された`folder1/file0.txt`をダウンロードして、その内容を画面に表示します。

```
PS C:\> $downloaded = $s3objects[0] | Read-S3Object -Folder ($HOME + '\Downloads\s3')
PS C:\>
PS C:\> Get-Content -LiteralPath $downloaded.FullName
僕はプロの独身なんで
PS C:\>
```

　さきほど、余計な画像（`folder1/file1.jpg`）をアップロードしてしまったので削除します。

```
PS C:\> Remove-S3Object -Key $s3objects[1].Key -BucketName $s3objects[1].BucketName

確認
この操作を実行しますか?
対象 "" に対して操作 "Remove-S3Object (DeleteObjects)" を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

DeleteMarker VersionId RequestCharged
------------ --------- --------------



PS C:\>
```

　確認のメッセージは表示されたものの、削除対象が何なのか表示されていません。結果がどうなっているのか恐ろしいので確認します。

```
PS C:\> Get-S3Object -KeyPrefix folder1 -BucketName $s3objects[0].BucketName


ETag         : "7d26477a9093369734740028efcf997a"
BucketName   : bucket00rtyhjkjjk
Key          : folder1/file0.txt
LastModified : 2017/01/29 11:04:12
Owner        : Amazon.S3.Model.Owner
Size         : 20
StorageClass : STANDARD



PS C:\>
```

　どうやら意図したとおりに削除されたようで安心です。