JavaScriptフロントエンドアプリケーションから、S3から画像オブジェクトを取得しようとしています。
ドキュメントによると、必要な手順は次のとおりです。
import * as AWS from "aws-sdk";
AWS.config.update({accesKeyId, secretAccesKey, region});
let s3 = new AWS.S3();
そして、次のようなオブジェクトを取得できます。
function listObjects(bucketName, folderName) {
return new Promise((resolve) => {
s3.listObjects({Bucket: bucketName, Prefix: folderName}).promise()
.then((data) => {
resolve(data.Contents);
})
});
}
すべてが正しく機能しているように見えますが、心配なのは、バケットにアクセスするために、フロントエンドアプリケーションでaccessKeyIdとsecretAccessKeyも保持する必要があることです。
バケットを保護する方法、またはこれらの機密データを提供せずにオブジェクトにアクセスする方法を教えてください。
あなたは心配する権利があります。誰でもアプリから認証情報を取得できるようになります。これにはいくつかのアプローチがあります。
オブジェクトが実際に機密性を持たない場合、資格情報がすべての人に許可したいアクションのみを実行できれば、何も失われません。さらに言えば、バケットにアクセス許可を適切に設定すれば、資格情報の必要性をすべてまとめて取り除くことができるはずです。必要に応じて、リストのアクセス許可も含まれていると思います。
オブジェクトが機密である場合、ユーザー用の何らかの認証システムがすでにあります。Oauthアカウントを使用して認証(google、amazon、facebookなど)を行っている場合は、AWS Cognitoを使用して、そのユーザーに関連付けられた短期間のAWS認証情報を生成できます。これにより、ユーザー間の権限を区別できます。すでにoauthを使用している場合は、かなり滑らかでぴったりです。oauthを使用していない場合は、使用する必要があるかどうかを検討してください。ユーザーに独自の認証資格情報レイヤーを渡すよりもはるかに安全です。https://aws.amazon.com/cognito/
cognitoを使用したくない、または使用できない場合でも、バックエンドからAWSの役割を引き受け、15分から1時間以上で自動的に期限切れになる一時的な認証情報を生成して、それらの認証情報をフロントエンドに渡すことができます。私はそれを「貧乏人のコグニート」と呼んでいますが、サービスを提供するためにインフラストラクチャを実行する方が、コグニートのコストよりも実際にはおそらく費用がかかると思います。
または、@ Tomasz Swinderが示唆しているように、アプリケーションを介してリクエストをプロキシし、ユーザーがリクエストしたアセットをs3リソースに解決し、バックエンドにプルしてからユーザーに提供するだけです。サーバーはs3のエンドポイントよりもエンドユーザーから離れているため、これはほとんどの場合劣ったソリューションです。また、プロキシするインフラストラクチャを実行する必要があります。しかし、そうは言っても、それはその場所です。
最後に、事前に署名されたs3URLがアプリケーションに適している場合があります。通常、バックエンドは、ユーザーに提供する前にs3URLに直接署名します。署名は操作(PUTまたはGET)を承認するのに十分ですが、署名に使用される秘密鍵は含まれていません。つまり、事前署名されたURLは承認されたURLを提供しますが、承認に使用される資格情報は提供しません。 'は、s3にアドホック認証を提供するための優れた方法です。
全体として、バックエンドのないアプリケーションがあることは本当に素晴らしいことです。そのためには、サードパーティの認証とcognitoのようなものが必要になります。ただし、使用を開始すると、あらゆる種類のawsサービスを使用して、バックエンドで実行されるものを提供できます。許可に注意してください。awsはすべて有料であり、通常、サービスへの呼び出しを制限して、残酷なインターネットユーザーが一時的なクレジットを使用して大量の呼び出しを行うことでAWSの請求額を引き上げようとする機能はありません。それらを提供しました。これに対する注目すべき例外の1つは、API Gatewayです。これは、ユーザーごとのレート制限を許可するため、認識認証されたサーバーレスバックエンドに最適です。
また、s3オブジェクトのリストはs3オブジェクトのGETよりもはるかに遅く、はるかに高価である(操作ごとに安価ですが、10倍)ため、通常は可能な限りlISTを呼び出さないようにするのが最善です。私はただそれをそこに投げています、私はあなたがs3接続をテストするためにそれをしているのではないかと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加