ここ数年、私は AWS や GCP などのクラウド プラットフォームを使用せずに、SaaS を構築して独自のインフラストラクチャにデプロイする方法を考えてきました。このリポジトリでは、オープンソース テクノロジー スタックのみを使用して、S3 と同じように機能する (自動バケット デプロイ、動的拡張ボリューム、セキュリティなど) AWS S3 のクローンを構築する私の進捗状況を文書化します。
@aws-sdk/client-s3
を使用したライブ POC const { S3Client , ListObjectsV2Command , PutObjectCommand } = require ( "@aws-sdk/client-s3" ) ;
const Bucket = 'BUCKET_NAME_HERE' ;
const Namespace = 'NAMESPACE_HERE' ;
const accessKeyId = "xxxxxxxxxxxxxxxxxxxx" ;
const secretAccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
( async function ( ) {
const client = new S3Client ( {
region : 'us-west-2' ,
endpoint : `https:// ${ Bucket } . ${ Namespace } .s3.anthonybudd.io` ,
forcePathStyle : true ,
sslEnabled : true ,
credentials : {
accessKeyId ,
secretAccessKey
} ,
} ) ;
const Key = ` ${ Date . now ( ) . toString ( ) } .txt` ;
await client . send ( new PutObjectCommand ( {
Bucket ,
Key ,
Body : `The time now is ${ new Date ( ) . toLocaleString ( ) } ` ,
ACL : 'public-read' ,
ContentType : 'text/plain' ,
} ) ) ;
console . log ( `New object successfully written to: ${ Bucket } :// ${ Key } n` ) ;
const { Contents } = await client . send ( new ListObjectsV2Command ( { Bucket } ) ) ;
console . log ( "Bucket Contents:" ) ;
console . log ( Contents . map ( ( { Key } ) => Key ) . join ( "n" ) ) ;
} ) ( ) ;
ランディング Web サイト、フロントエンド アプリ、バックエンド REST API のコードを保存する方法が必要になります。コードをコンパイルしてインフラストラクチャにデプロイするために CI/CD も必要になります。 GitLab はこれら 2 つのタスクを完璧に実行します。
ノードが通信するにはネットワークが必要です。ルーターには OpenWRT を選択しました。これにより、Raspberry Pi を USB 3.0 イーサネット アダプターで使用できるようになり、インターネットと「データセンター」の間のルーターとして機能できるようになります。
AWS で S3 バケットを作成すると、すべてが自動化され、どこかのデータセンターでバケットのスケジュールを設定するために CLI コマンドを入力する人間は存在しません。このプロジェクトも同様に機能する必要があります。ユーザーがリソースを作成する場合、バケットをプロビジョニングおよびデプロイするために人間による入力を必要としない必要があります。
AWS の規模により、各ユーザーに専用のサーバー ハードウェアを提供することは経済的に現実的ではありません。代わりにハードウェアが仮想化され、複数のテナントが単一の物理 CPU を共有できるようになります。同様に、ノード全体と SSD を各バケットに割り当てることも現実的ではありません。リソース使用率を最大化するには、プラットフォームで複数のテナントが利用可能な SSD ストレージ領域のプールを共有できる必要があります。さらに、AWS S3 バケットは無制限の量のデータを保存できるため、私のプラットフォームでは、ユーザーが必要なストレージ容量に基づいて自動スケールするボリュームを動的に増加できるようにする必要もあります。
複数のデバイスに同時に SSH 接続する必要があります。各コマンドを実行する場所を示すために、このリポジトリ内のすべてのコマンドに注釈 (例: [Console] nano /boot/config.txt
) を追加しました。通常は[Console]
と[Node X]
が表示されます。
これはまだ進行中の作業であるため、全体を通して私のメモが斜体「 AB: 」で表示されますが、無視してください。