Powershell で S3 にフォルダーをアップロードしてみる。(AWS Tools for PowerShell を使用。)

記事タイトルとURLをコピーする

こんにちは。
技術課の山本です。

冬ですね。
今年も雪山に行って、純白な気持ちになっています。

Powershell で S3 にフォルダーをアップロードしてみる。(AWS Tools for PowerShell を使用。)

S3 は耐障害性・可用性の高いオブジェクトストレージです。
例として、S3 に ファイルを置くと、自動的に複数のデータセンター内(アベイラビリティゾーン)にコピーして保管します。(可用性)
ご参考:高い可用性と耐久性のオブジェクトストレージ。Amazon S3 をグラレコで解説

本記事では、利用者が AWS Tools for PowerShell を使用して、ローカルPC(サーバー)上のフォルダーを S3 に保管することを想定します。
Powershell スクリプトにしておくことで、ローカルPC(サーバー) 上のタスクスケジューラ、cron等に登録して、毎日1回など自動的に実行できます。
前提を以下に置きます。

  • ローカルPC(サーバー) には Windows Powershell が入っている
  • ローカルPC(サーバー)はインターネットに接続している
  • AWSアカウントを持っていて、AWSマネジメントコンソールにログインしてIAMユーザーの作成やS3バケット、SNSトピックの作成を実施できる

構成図:

S3 バケットの作成

まずは、S3 バケットを作成します。
バケット名は任意、リージョンは東京(ap-northeast-1)を指定します。
他はそのままで大丈夫です。

SNS トピックの作成

次に、SNSトピックを作成します。
スタンダードタイプを選択し、任意の名前をつけます。
他はそのままで大丈夫です。

SNSトピックのARN を控えてください。

作成したトピックにサブスクリプションを作成します。
プロトコルは「Eメール」を選択し、通知先となるのメールアドレスを入れます。

確認メールが来るので、"Confirm subscription"を押します。

IAM ユーザーの作成

次に IAM ユーザー を作成します。
AWS Tools for PowerShell の実行ユーザーです。

「アクセスキー・プログラムによるアクセス」にチェックして、任意の名前で作成します。
他はそのままで大丈夫です。

作成した際に表示される、アクセスキー・シークレットアクセスキーを控えてください。(画像割愛)

作成した IAMユーザーに 以下の IAM ポリシー を作成して付与します。(IAMポリシーの作成方法は割愛)
26,27 行目の S3 バケット名を作成したものに置き換えください。
33 行目は、上で控えた SNSトピックの ARN に置き換えください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListStorageLensConfigurations",
                "s3:ListAccessPointsForObjectLambda",
                "s3:GetAccessPoint",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListAccessPoints",
                "s3:PutAccessPointPublicAccessBlock",
                "s3:ListJobs",
                "s3:PutStorageLensConfiguration",
                "s3:ListMultiRegionAccessPoints",
                "s3:CreateJob"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::powershell-test-yamamoto",
                "arn:aws:s3:::powershell-test-yamamoto/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:ap-northeast-1:123456789012:powershell-test-yamamoto"
        }
    ]
}

付与後:

AWS Tools for PowerShell の導入

AWS Tools for PowerShell のインストールを 参考に、導入します。
ローカルPC (サーバー) でPowershell を起動します。

インストーラを導入します。

Install-Module -Name AWS.Tools.Installer

各サービス用のコマンドレットを導入します。参考:PowerShell Gallery

Install-AWSToolsModule AWS.Tools.SimpleNotificationService,AWS.Tools.S3 -CleanUp

AWSと認証するためのキー情報を設定します。 -StoreAs に設定するのは、何のための認証情報か分かるようにするための簡単な名前です。

Set-AWSCredential `
                -AccessKey <アクセスキー> `
                -SecretKey <シークレットアクセスキー> `
                -StoreAs <適当な名前>

-StoreAS で指定した名前で認証情報を登録できているかは、以下のコマンドで確認ください。

Get-AWSCredential -ListProfile

実行例(Macbookにて)

※筆者の環境は Macbook に Powershell をインストールしています。(Windows じゃないのです。)

AWS Tools for PowerShell を実行してみる

使用する認証情報を設定します。

Set-AWSCredential -ProfileName powershell-test-yamamoto01

フォルダ「/Users/tetsuya/_sandb/bk」を、 S3 バケット 「powershell-test-yamamoto」にバックアップします。バックアップ先でのフォルダ名は「bktest」とします。

Write-S3Object -BucketName powershell-test-yamamoto -Folder "/Users/tetsuya/_sandb/bk"-KeyPrefix bktest

実行例(Macbookにて)

※筆者の環境は Macbook に Powershell をインストールしています。(Windows じゃないのです。)

完成したスクリプト

以下のようなスクリプトになります。

  1. フォルダ「/Users/tetsuya/_sandb/bk」を、 S3 バケット 「powershell-test-yamamoto」にバックアップ。S3 上でのフォルダ名は「bk_<日付時刻>」
  2. 結果を Eメールで通知
  3. 詳細な実行結果を、実行ディレクトリにある result.log に、エラーを error.log に格納
# 前提
# https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/pstools-welcome.html
# 
# Install-Module -Name AWS.Tools.Installer
# Install-AWSToolsModule AWS.Tools.SimpleNotificationService
# Install-AWSToolsModule AWS.Tools.EC2,AWS.Tools.S3 -CleanUp
# Set-AWSCredential `
#                -AccessKey AXXXXXXx `
#                -SecretKey xxxxxxxxxxxxxxxxxxxxx `
#                -StoreAs powershell-test-yamamoto01

try {
    # ここまでは要件に応じて書き換え必須 ###########################################################
        # AWSプロファイル名
        $aws_profile="<-StoreAS で指定した名前>

        # バックアップファイル格納先 S3 の バケット名
        $s3bucket="powershell-test-yamamoto"
    
        # バックアップ対象のフォルダ
        $backup_original_folder="/Users/tetsuya/_sandb/bk"

        # 日付取得
        $date = Get-Date -format "yyyyMMddHHmmss"

        # バックアップ先のフォルダ
        $backup_destination_folder="bk_$date"

        # 通知先SNS トピック
        $topicarn="arn:aws:sns:ap-northeast-1:123456789012:powershell-test-yamamoto"

    # ここからは書き換え不要 ###########################################################

        # AWSプロファイル設定
        Set-AWSCredential -ProfileName $aws_profile

        # S3にアップロード
        Write-S3Object -BucketName $s3bucket -Folder $backup_original_folder -KeyPrefix $backup_destination_folder > result.log 2>&1
        # 通知
        Publish-SNSMessage -TopicArn $topicarn -Message "(成功) $backup_original_folder のバックアップに成功しました。"
} catch {
    $error > error.log
    Publish-SNSMessage -TopicArn $topicarn -Message "(失敗) $backup_original_folder のバックアップに失敗しました。"
} finally {
    exit 0
}

結果例:

リストア用スクリプト

フォルダーをローカルPCにリストアすることを想定し、以下の Powershell スクリプトも作成しました。

# S3 上のフォルダをローカル端末にリストアする Powershell です。
try {
    # ここまでは要件に応じて書き換え必須 ###########################################################
        # AWSプロファイル名
        $aws_profile="powershell-test-yamamoto01"
        # バックアップファイル格納先 S3 の バケット名
        $s3bucket="powershell-test-yamamoto"
        # リストア対象のフォルダ(S3バケットにあるフォルダ)
        $restore_original_folder="Backup/20230117XXXX"
        # リストア先のフォルダ(ローカル端末のフォルダ)
        $restore_destination_folder="./Users/tetsuya/_sandb/restore"
    # ここからは書き換え不要 ###########################################################
        # AWSプロファイル設定
        Set-AWSCredential -ProfileName $aws_profile
        # S3からダウンロード
        Read-S3Object -BucketName $s3bucket -KeyPrefix $restore_original_folder -Folder $restore_destination_folder
} catch {
    $error > error.log
} finally {
    exit 0
}

まとめ

Powershell で S3 にフォルダーをアップロードしてみました。

参考

AWS Tools for PowerShell 関連

AWS Tools for PowerShell とは何ですか?
AWS Tools for PowerShell Cmdlet Reference
オブジェクトの Amazon S3 バケットへのアップロード
Write-S3Object Cmdlet
Publish-SNSMessage Cmdlet

Powershell 関連

昔、Powershell の勉強会をしていた頃の資料です。
索引は微妙なものの、かなり詳細に書いています。

SlideShare
PowerPoint

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、サウナ、音楽鑑賞(J-Pops)、お笑い鑑賞(ラランド)