ファイル共有にはいろんな手段がありますが、最近 S3 も悪くないと感じています。
さて今回は、 PowerShellを使って S3へのファイルアップロードとURI取得、ダウンロードをしてみましょう。
今回もInitialize-AWSDefaults
で、クレデンシャルがセットされている状態とします。
目次
S3bucketを作成する
s3は他の利用者とも重ならない一意な名称を付ける必要があるので注意してください。
New-S3Bucket -BucketName public
名前が重複するとエラーが出ます。
New-S3Bucket : The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
今回は、サンプルなのでpublicのまま行きます。
S3Objectを書き込む
S3の対象 bucketに対して、ファイルをアップロードするには、 Write-S3Object
を利用します。
例えば、 d:\s3uploadのファイルを s3bucketname publicに書き込むなら次のような感じです。
# define $path = "d:\s3upload" $s3bucketname = "public" # upload file to s3 Get-ChildItem -Path $path ` | %{ Write-S3Object -BucketName $s3bucketname -File $_.Name -Key $_.Name -CannedACLName PublicRead }
書きこんだ内容は、 Get-S3Object
で確認できます。
Get-S3Object -BucketName $s3bucketname
S3ObjectのダウンロードURIを取得する
対象のS3Objectに対して、Expire dateを付けた URIを生成します。
$S3object = "test.pdf" Get-S3PreSignedURL -BucketName $s3bucketname -Key $s3object -Expires "2013/12/31"
例えばこのように生成されます。
https://public.s3-ap-northeast-1.amazonaws.com/test.pdf?AWSAccessKeyId=AHOGEHOGEHOGEHOGECSA&Expires=1388415600&Signature=iHOGEHOGEa9%HOGEvYiqWt6jhogeM%3D
S3Objectをダウンロードする
あとは、ブラウザなどで URI をGet Methodを使って取得します。
PoweShellの場合は、 Invoke-RestMethod -Method Get
がいいでしょう。 Start-BitsTransfer
ではダメです。
Invoke-RestMethod -Method Get -Uri Get-S3PreSignedURL -BucketName $s3bucketname -Key $s3object -Expires "2013/12/31" -OutFile d:\hoge.pdf
まとめ
単ファイルであれば、URI取得テストとURIも容易にできます。
ファイルを隠したり注意して使えば、さくっとファイルを渡すのにいい手段になりえるかも知れません。
# define $path = "D:\test.ps1" $s3bucketname = "publictest" $expiredate = "2013/12/31" try { # new bucketname if (-not(Get-S3Bucket -BucketName $s3bucketname)) { New-S3Bucket -BucketName $s3bucketname } # upload file to s3 $file = Get-ChildItem -Path $path if (-not(Get-S3Object)) { Write-S3Object -BucketName $s3bucketname -File $file.FullName -Key $file.Name -CannedACLName PublicRead } else { Write-Error ("S3 bucket name {0} already contains key name {1}, escape from overwrite. Please check file name to upload." -f $s3bucketname,$file.name) } # get s3 object test with filename adding 2 at last Invoke-RestMethod -Method Get -Uri (Get-S3PreSignedURL -BucketName $s3bucketname -Key $file.Name -Expires $expiredate) -OutFile ("d:\" + $file.BaseName + 2 + $file.Extension ) (Get-S3PreSignedURL -BucketName $s3bucketname -Key $file.Name -Expires $expiredate) } catch { throw $_ }