Microsoftの製品だからと毛嫌いされているのか、あまり使われていない印象のあるPowerShell……。慣れてしまえば非常に快適だと思うんですけどね。この記事では、AWS Tools for Windows PowerShellでS3を扱う方法をチュートリアル風に書いています。
AWS Tools for Windows PowerShellのインストールについては公式の説明か、PowerShellでAWSに書かれていますので、すでにインストールが済んでいることを前提にします。
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:\>
どうやら意図したとおりに削除されたようで安心です。