AWS SDK for JavaScript in the Browserでs3+js+facebookアプリのチュートリアルをやってみた際のハマりどころメモ
ブラウザからS3に画像をアップロードするfacebookアプリケーションのチュートリアルがあったので試してみました。
やってみたチュートリアル(※英語)
AWS SDK for JavaScript in the Browser (Developer Preview)にアクセス
Getting Started をクリック。↓のようなページ。
1.Facebookアプリを作成
Facebook developer pageにアクセスしCreate New appでアプリ作成。既にある場合はこの手順は不要。
アプリの名称とカテゴリを入力して登録。アプリ名にfbとかfacebookという文字は含めることができなかった。
作成したらアプリIDを控える。
2.IAMの作成
IAM:Identity and Access Management の略です。
IAM consoleにアクセスして、Create New Role。
ロール名を入力。
Grant access to web identity providersを選択
先ほどつくったFacebookのアプリIDを入力
次へ。
カスタムポリシーを選択。
JavaScript in the BrowserのJSONをコピー
コピーしたJSONを貼付ける。その際に、YOUR_BUCKET_NAMEの部分を自分のバケット名に置き換える。ここでやっていることは、facebookアプリのユーザがS3に対してどのような権限を持つかを記載しているみたい。
あとはCreateRoleのボタンで作成完了。Role ARNの文字列は後から使います。
3.S3バケットにCORSの設定
Amazon S3 consoleにアクセスして、 Edit CORS Configurationを選択。
CROSSの内容をコピペして張り付け。 AllowedOriginの所は自分のドメインにしといた方が安全だけどもSSLでない場合は偽装できそうな気がする。。
4.HTMLを作成してS3にアップ
サンプルのHTMLをコピーして、'YOUR_APP_ID', 'YOUR_ROLE_ARN','YOUR_BUCKET_NAME' をそれぞれ書き換える。
でHTMLをS3にアップロード。
注意:バケットがtokyoの場合は他にも一部修正が必要です。
var bucket = new AWS.S3({params: {Bucket: bucketName}, region: 'ap-northeast-1', maxRetries: 15});
regionを選択してないと、No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin api....ってエラーが発生します。
どうも作成途中のチュートリアルっぽいので一部修正
bucket.putObject(params, function (err, data) { if (err) { results.innerHTML = 'ERROR: ' + err; } else { var imageTag = ""; results.innerHTML += imageTag; } });
↓バケットにファイルをアップした際に、imgタグをinnerHTMLに設定するように修正
var fileurl = 'http://' + bucketName + '/' + objKey; bucket.putObject(params, function (err, data) { if (err) { results.innerHTML = 'ERROR: ' + err; } else { var imageTag = '<img src="' + fileurl + '"/>'; results.innerHTML += imageTag; } });
5. 確認
S3にアップしたサイトにアクセスすると、facebookのログインを求められる。ログインしてる場合は省略される。
ログイン後にアプリの認証。
OKすると、ファイルアップロードのボタンが表示される。
ファイルをアップロードすると、S3にアップロードされて、保存された画像がimgタグに書き出され表示される。
生成されたimgタグを確認
バケットにも反映されてる。
以上でチュートリアルが完了。
ふりかえり。
keep
s3に関する調査は今後も続けよう。
problem
リージョンを意識しわすれて、CROSS部分でハマった。 mitsugeek.netって自分のドメインのページでテストしてるのはあまり良くない。
try
セキュリティの部分。fecebookのユーザ単位で見れる見れない等の制御とかできるのか?他のユーザのディレクトリに保存できてしまうのか?アクセスログとかいるのか?
場合によっては緩いサービスでしか利用価値はないかもしれない。 とはいいつつも、Developer Previewということなので、 これでサービス運用は企業システムでは今のところあり得ない話かもしれない。