PowerShellからCloudflare R2を操作する。
Cloudflare R2へのファイルアップロード・ダウンロードをクライアント環境を汚さないように、Windows PowerShellだけで実現する。
2024年5月26日
Cloudflare R2とは
Cloudflare R2はAmazon Web Services(AWS) S3
互換のオブジェクトストレージです。10GBまで無料で利用でき、R2からインターネット向けの通信(エグレス通信)に料金がかからない特徴があります。また、S3と同じ仕様のAPIを使ってクライアントアプリケーションやプログラムからファイルの読み書きができます。
CloudflareのCDNを使って配信されるため、あらゆる場所から高速にファイルをダウンロードできます。
Windows PowerShellとは
PowerShell
はWindowsで従来使われていたコマンドプロンプトを置き換えるキャラクターユーザーインタフェース(CUI)です。
ターミナルにコマンド(コマンドレット)を入力してファイル操作等の処理をするだけでなく、スクリプト言語としても利用できます。拡張子.ps1
のファイルに変数や条件分岐、繰り返しなどの制御構文を駆使してコードを書けば、複雑な処理も実現できます。
Import-Module
コマンドでモジュールを追加すると、ローカル環境にインストールされているアプリケーションやクラウドサービスを利用することもできます。
AWS Tools for Windows PowerShell
AWS Tools for Windows PowerShell
はAWSが公式にリリースしているPowerShellのモジュールです。S3だけではなくEC2、Route53などさまざまなリソースを操作できます。便利なのですが、PowerShellのInstall-Module
コマンドレットはエラーがしばしば発生してしまいます。
追加するモージュールが信頼できる発行元によってデジタル署名されていないと、このオブジェクトにプロパティ 'ValidAuthenticodeSignatureInFile' が見つかりません。プロパティが存在することを確認してください。
エラーが発生します。
PowerShellには実行ポリシー
という仕組みがあって、インターネットからダウンロードされたスクリプトファイルの実行を防止したり、スクリプトへ署名の有無を確認したりなど悪意のあるコマンドレットの実行を防止する機能です。この機能でブロックされるとこのシステムではスクリプトの実行が無効になっている
などのエラーが発生します。
AWS Toolsに依存しないPowerShellスクリプト
S3オブジェクトストレージを操作するだけであれば、AWS Tools for Windows PowerShell
を使わず、単体のPowerShellスクリプトだけで十分な場合があります。また、会社で管理されている環境の場合はプロキシの制限やモジュールのインストール制限があって、モジュールを追加できない場合もあります。
PowerShellスクリプトの実装
GitHub Gistに完成したPowerShellのスクリプトを公開しました。
R2へアクセスするので当然、アクセスキーやエンドポイントを指定しなければいけないので、その点を解説します。
# Cloudflare R2バケットのエンドポイントホスト名
[string] $hostr2 = ""
$hostr2
はCloudflare管理ページのR2 > 概要
ページの右上、アカウントID
の値を使用します。アカウントIDに英数字のランダムな文字列が設定されているので、この値 + .r2.cloudflarestorage.com
がホスト名になります。たとえばアカウントIDがabcdef12345
の場合はabcdef12345.r2.cloudflarestorage.com
となります。R2 APIトークンの管理
リンクからアクセスキー等の発行ページへ移動します。
すでにAPIトークンが発行されている場合は、そのトークンが一覧表示されています。APIトークンを作成する
から新しいトークンを作成します。
トークンの名称を任意に設定し、権限は最小限になるようにオブジェクトの読み取りと書き込み
を選択します。ページ末尾のトークンの作成
ボタンを押すと、移動先のページでトークンが表示されます。
アクセスキーID
とシークレットアクセスキー
が一度だけ表示されます。このページから移動すると再度表示できないので、忘れないように管理しておきます。
アクセスキーIDの値を$access_key
へ設定します。
# Cloudflare R2バケットへのアクセスキー
[string] $access_key = ""
シークレットアクセスキーの値を$secret_key
へ設定します。
[string] $secret_key = ""
最後に$backetname
はファイルを保存・取得したいR2のバケット名を設定します。
# Cloudflare R2バケット名
[string] $bucketname = ""
ちなみにR2にはリージョンの概念がありませんが、S3互換のためリージョンを指定しないといけません。推奨としてus-east-1
を指定しますが、無視されます。
# Cloudflare R2のリージョンはus-east-1で固定
[string] $region = "us-east-1"