PowerShellからCloudflare R2を操作する。

Windows PowerShellロゴ画像

Cloudflare R2へのファイルアップロード・ダウンロードをクライアント環境を汚さないように、Windows PowerShellだけで実現する。

2024年5月26日

CloudflarePowerShell

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のスクリプトを公開しました。

satakujp / cloudflarer2.ps1

R2へアクセスするので当然、アクセスキーやエンドポイントを指定しなければいけないので、その点を解説します。

  # Cloudflare R2バケットのエンドポイントホスト名
  [string] $hostr2 = ""

$hostr2はCloudflare管理ページのR2 > 概要ページの右上、アカウントIDの値を使用します。アカウントIDに英数字のランダムな文字列が設定されているので、この値 + .r2.cloudflarestorage.comがホスト名になります。たとえばアカウントIDがabcdef12345の場合はabcdef12345.r2.cloudflarestorage.comとなります。R2 APIトークンの管理リンクからアクセスキー等の発行ページへ移動します。

Cloudflare R2アカウント詳細

すでにAPIトークンが発行されている場合は、そのトークンが一覧表示されています。APIトークンを作成するから新しいトークンを作成します。

Cloudflare R2 APIトークン一覧

トークンの名称を任意に設定し、権限は最小限になるようにオブジェクトの読み取りと書き込みを選択します。ページ末尾のトークンの作成ボタンを押すと、移動先のページでトークンが表示されます。

Cloudflare R2 APIトークン作成

アクセスキーIDシークレットアクセスキーが一度だけ表示されます。このページから移動すると再度表示できないので、忘れないように管理しておきます。

Cloudflare R2 APIトークンの表示

アクセスキー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"

参考サイト