funasaki memo

このブログ上の投稿は個人のものであり、所属する企業を代表する投稿ではありません。所属:AWSのSolutions Architect

Cognito Identity PoolsのUnauthenticated Identity(認証されていないID)を使ってS3へアップロードする

実現するのは以下のイメージです。
f:id:kenjifunasaki:20181004165338p:plain

JavaScriptを使って、Cognito Identity Poolから必要なトークンを取得、トークンに含まれる一時的な認証情報を使って、S3へファイルをアップロードします。

前提条件

Cognito ID Poolを作成する

f:id:kenjifunasaki:20181004185340p:plain
IDプール名を入れて、認証されていないIDに対してアクセスを有効にします。

作成するプールのIDに割り当てるIAMロールを作成

f:id:kenjifunasaki:20181004185730p:plain

JavaScript用のコードの確認

f:id:kenjifunasaki:20181004190020p:plain
こちらにあるIdentityPoolIdは後程使います。

作成したIAMロールにS3の権限を与える

UnAuthRoleとAuthRoleが作成されているのが分かります。
f:id:kenjifunasaki:20181004190511p:plain

今回はUnAuthRoleを使うので、こちらにAmazonS3FullAccess権限を追加します。今回はテスト用にFullAccess権限を追加していますが、最小権限の権限を追加するようにしてください。
f:id:kenjifunasaki:20181004191445p:plain

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を配置する。

S3へのアップロード

http:///s3upload-unauth.html へアクセスすると、以下のような画面が表示される。
f:id:kenjifunasaki:20181004193646p:plain

ファイルを選択してアップロードします。

f:id:kenjifunasaki:20181004194241p:plain

成功すると、以下のようにUPLOADと表示されます。上手くいかない場合はChromeであれば、ChromeのDeveloper Toolのコンソールを見るなどしてエラー内容を確認します。

S3の指定したバケットにで正しくアップロードされていることを確認できました!

このように、Cognito Identityを使って、一時的な認証情報を取得し、S3へアップロードすることができました。