tech.guitarrapc.cóm

Technical updates

PowerShell で Amazon S3 を使ったファイルアップロードとファイル取得をしてみる

ファイル共有にはいろんな手段がありますが、最近 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 $_
}