R2 APIに対する認証トークンを使用した認証
Last reviewed: 27 days ago
以下の例は、S3 APIとAPIトークンを使用してR2に対して認証する方法を示しています。
以下の環境変数を設定してから、いずれかの例を実行してください:
export R2_ACCOUNT_ID=your_account_idexport R2_ACCESS_KEY_ID=your_access_key_idexport R2_SECRET_ACCESS_KEY=your_secret_access_keyexport R2_BUCKET_NAME=your_bucket_nameS3 API用のaws-sdkパッケージをインストールします:
npm install aws-sdkconst AWS = require('aws-sdk');const crypto = require('crypto');
const ACCOUNT_ID = process.env.R2_ACCOUNT_ID;const ACCESS_KEY_ID = process.env.R2_ACCESS_KEY_ID;const SECRET_ACCESS_KEY = process.env.R2_SECRET_ACCESS_KEY;const BUCKET_NAME = process.env.R2_BUCKET_NAME;
// 秘密アクセスキーをハッシュ化const hashedSecretKey = crypto.createHash('sha256').update(SECRET_ACCESS_KEY).digest('hex');
// Cloudflare R2用のS3クライアントを設定const s3Client = new AWS.S3({ endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`, accessKeyId: ACCESS_KEY_ID, secretAccessKey: hashedSecretKey, signatureVersion: 'v4', region: 'auto' // Cloudflare R2はリージョンを使用しませんが、SDKには必要です});
// オブジェクトキーを指定const objectKey = '2024/08/02/ingested_0001.parquet';
// オブジェクトを取得する関数async function fetchObject() { try { const params = { Bucket: BUCKET_NAME, Key: objectKey };
const data = await s3Client.getObject(params).promise(); console.log('オブジェクトの取得に成功しました');
// 必要に応じてデータを処理 // 例えば、内容をBufferとして取得するには: // const content = data.Body;
// またはファイルを保存するには('fs'モジュールが必要): // const fs = require('fs').promises; // await fs.writeFile('ingested_0001.parquet', data.Body);
} catch (error) { console.error('オブジェクトの取得に失敗しました:', error); }}
fetchObject();S3 APIクライアントboto3をインストールします:
pip install boto3次のPythonスクリプトをpython3 get_r2_object.pyで実行します。object_keyをR2バケット内の既存のファイルを指すように変更してください。
import osimport hashlibimport boto3from botocore.client import Config
ACCOUNT_ID = os.environ.get('R2_ACCOUNT_ID')ACCESS_KEY_ID = os.environ.get('R2_ACCESS_KEY_ID')SECRET_ACCESS_KEY = os.environ.get('R2_SECRET_ACCESS_KEY')BUCKET_NAME = os.environ.get('R2_BUCKET_NAME')
# SHA-256を使用して秘密アクセスキーをハッシュ化hashed_secret_key = hashlib.sha256(SECRET_ACCESS_KEY.encode()).hexdigest()
# Cloudflare R2用のS3クライアントを設定s3_client = boto3.client('s3', endpoint_url=f'https://{ACCOUNT_ID}.r2.cloudflarestorage.com', aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=hashed_secret_key, config=Config(signature_version='s3v4'))
# オブジェクトキーを指定object_key = '2024/08/02/ingested_0001.parquet'
try: # オブジェクトを取得 response = s3_client.get_object(Bucket=BUCKET_NAME, Key=object_key)
print('オブジェクトの取得に成功しました')
# 必要に応じてレスポンス内容を処理 # 例えば、内容を読み取るには: # object_content = response['Body'].read()
# またはファイルを保存するには: # with open('ingested_0001.parquet', 'wb') as f: # f.write(response['Body'].read())
except Exception as e: print(f'オブジェクトの取得に失敗しました。エラー: {str(e)}')go getを使用して、Goプロジェクトにaws-sdk-go-v2パッケージを追加します:
go get github.com/aws/aws-sdk-go-v2go get github.com/aws/aws-sdk-go-v2/configgo get github.com/aws/aws-sdk-go-v2/credentialsgo get github.com/aws/aws-sdk-go-v2/service/s3次のGoアプリケーションをスクリプトとしてgo run main.goで実行します。objectKeyをR2バケット内の既存のファイルを指すように変更してください。
package main
import ( "context" "crypto/sha256" "encoding/hex" "fmt" "io" "log" "os"
"github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/s3")
func main() { // 環境変数を読み込む accountID := os.Getenv("R2_ACCOUNT_ID") accessKeyID := os.Getenv("R2_ACCESS_KEY_ID") secretAccessKey := os.Getenv("R2_SECRET_ACCESS_KEY") bucketName := os.Getenv("R2_BUCKET_NAME")
// 秘密アクセスキーをハッシュ化 hasher := sha256.New() hasher.Write([]byte(secretAccessKey)) hashedSecretKey := hex.EncodeToString(hasher.Sum(nil))
// Cloudflare R2用のS3クライアントを設定 r2Resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { return aws.Endpoint{ URL: fmt.Sprintf("https://%s.r2.cloudflarestorage.com", accountID), }, nil })
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithEndpointResolverWithOptions(r2Resolver), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyID, hashedSecretKey, "")), config.WithRegion("auto"), // Cloudflare R2はリージョンを使用しませんが、SDKには必要です ) if err != nil { log.Fatalf("SDK設定の読み込みに失敗しました, %v", err) }
// S3クライアントを作成 client := s3.NewFromConfig(cfg)
// オブジェクトキーを指定 objectKey := "2024/08/02/ingested_0001.parquet"
// オブジェクトを取得 output, err := client.GetObject(context.TODO(), &s3.GetObjectInput{ Bucket: aws.String(bucketName), Key: aws.String(objectKey), }) if err != nil { log.Fatalf("オブジェクトの取得に失敗しました, %v", err) } defer output.Body.Close()
fmt.Println("オブジェクトの取得に成功しました")
// 必要に応じてオブジェクト内容を処理 // 例えば、ファイルを保存するには: // file, err := os.Create("ingested_0001.parquet") // if err != nil { // log.Fatalf("ファイルの作成に失敗しました, %v", err) // } // defer file.Close() // _, err = io.Copy(file, output.Body) // if err != nil { // log.Fatalf("ファイルの書き込みに失敗しました, %v", err) // }
// または内容を読み取るには: content, err := io.ReadAll(output.Body) if err != nil { log.Fatalf("オブジェクト内容の読み取りに失敗しました, %v", err) } fmt.Printf("オブジェクト内容の長さ: %d バイト\n", len(content))}