はじめに
以前、Herokuのdyno無料枠が廃止された際に、移行先(代替え先)の検討をしました。
その中の一つ、Cyclicはcomputeリソース以外にストレージリソース(AWS S3 bucket)が提供されています。
しかし、外部から直接AWS S3 bucketへアクセスする場合、通常のAccess Key、Secret Access Keyに加えて、60分間だけアクセスできるSession Tokenを使用する必要があります。
Session Tokenに対応する
Cyclicの管理画面で、Data/Storage項目で表示されるLocal Credentialsをコピーして、ターミナルで実行すると、環境変数としてCredential情報が設定されます。
リスト表示するプログラム(Javascript版)
const { S3Client, ListObjectsV2Command } = require("@aws-sdk/client-s3");
// AWS認証情報とクライアントを設定
const s3Client = new S3Client({
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
sessionToken: process.env.AWS_SESSION_TOKEN
},
region: 'ap-southeast-2'
});
// S3バケット内のファイルリストを取得する関数
async function listS3Bucket(bucketName) {
try {
const data = await s3Client.send(new ListObjectsV2Command({ Bucket: bucketName }));
console.log("Bucket Contents:", data.Contents);
} catch (err) {
console.log("Error", err);
}
}
// バケット名を指定して関数を呼び出し
listS3Bucket('cyclic-easy-pike-poncho-ap-southeast-2');
リストを表示、ファイルをアップロード・ダウンロードするプログラム(Python版)
import boto3
s3 = boto3.resource('s3')
BUCKET_NAME = 'cyclic-easy-pike-poncho-ap-southeast-2'
# バケット内の全オブジェクトを表示
bucket = s3.Bucket(BUCKET_NAME)
objects = bucket.objects.all()
for obj in objects:
print(obj.key)
# オブジェクトをアップロード
#bucket.upload_file('file.txt', 'file.txt')
# オブジェクトをダウンロード
#bucket.download_file('file.txt', 'download.txt')
node-red-contrib-s3
Session Tokenに対応したカスタムノードを作成しました。
2024年2月1日にマージされました。🎉
サンプル
ねこ画像APIでねこ画像を取得し、S3へ格納、S3から取得するサンプルフローです。