Cognito Identity PoolsのUnauthenticated Identity(認証されていないID)を使ってS3へアップロードする
実現するのは以下のイメージです。
JavaScriptを使って、Cognito Identity Poolから必要なトークンを取得、トークンに含まれる一時的な認証情報を使って、S3へファイルをアップロードします。
前提条件
Cognito ID Poolを作成する
IDプール名を入れて、認証されていないIDに対してアクセスを有効にします。
作成するプールのIDに割り当てるIAMロールを作成
JavaScript用のコードの確認
こちらにあるIdentityPoolIdは後程使います。
作成したIAMロールにS3の権限を与える
UnAuthRoleとAuthRoleが作成されているのが分かります。
今回はUnAuthRoleを使うので、こちらにAmazonS3FullAccess権限を追加します。今回はテスト用にFullAccess権限を追加していますが、最小権限の権限を追加するようにしてください。
JavaScriptファイルを作成する
s3upload-unauth.htmlを作成します。
<html> <head> <script type="text/javascript" src="https://sdk.amazonaws.com/js/aws-sdk-2.6.9.min.js"></script> </head> <body> <input type='file' name='upload' id='upload-file'> <button id='upload-button'>upload</button> <div id="results"></div> <script type="text/javascript"> var upload = document.getElementById('upload-button'); var results = document.getElementById('results'); upload.addEventListener('click', function() { var uploadFile = document.getElementById('upload-file'); var file = uploadFile.files[0]; if(file) { var params = { IdentityPoolId: "ap-northeast-1:xxxxxxxx-xxxxx-xxxxxx-xxxx-xxxxxxxxxx" }; AWS.config.region = 'ap-northeast-1'; AWS.config.credentials = new AWS.CognitoIdentityCredentials(params); AWS.config.credentials.get(function(err) { if (!err) { console.log(AWS.config.credentials.identityId); var bucket = new AWS.S3({params: {Bucket: 'mybucketname'}}); var params1 = {Key: file.name, ContentType: file.type, Body: file}; bucket.putObject(params1, function (err, data) { results.innerHTML = err ? 'ERROR!' : 'UPLOADED.'; }); } }); } else { results.innterHTML = 'Noting to upload.'; } }, false); </script> </body> </html>
IdentityPoolIdの部分に作成したCognito IDプールのIDを入れます。さらに、mybucketnameの部分に自身のバケット名を入れます。
Apache Httpd Serverをインストールして、作成したJavaScriptを配置する
sudo yum install httpd -y sudo service httpd start
/var/www/html配下に作成したs3upload-unauth.htmlを配置する。