概要
みなさんこんにちはcandleです。今回はs3にアップロードされている画像ファイルをrailsのaws-sdk gemを使用して削除してみたいと思います。
記事中で開発している場所は家のローカル環境のrailsです。必ずしもs3を使うからと言って、EC2上で作業する必要はありません。
前提
railsの環境が構築されている
awsのアカウントを持っていて割と自由に使える
今回もtwitterbootstrap gemとscaffoldを使って説明します。別段、bootstrap gemが入っている必要がありませんが、見栄えが多少異なります。
rails4のtwitterbootstrap gem でscaffoldを作る方法は下のURLにあるので、もし、同じように進行したい場合は下の記事を参考にしてください。
https://joppot.s3.amazonaws.com/2014/05/27/1455
aws-gemを用意する
適当なプロジェクトを作成して、そのGemfileに下の内容を書き込みましょう。
私はbootstrap3というプロジェクトを使います。
gem 'aws-sdk'
gemをインストールする為に下のコマンドを入力しましょう。
bundle install
aws-sdk gemの準備が完了しました。
s3imageというscaffoldを作る
scaffoldを使って説明していきたいと思います。
scaffoldの詳しいことは別の記事に書いてあるので、ここではコマンドだけを紹介します。
下のコマンドでs3imageというscaffoldを作成します。
rails g scaffold S3image title:string file_name:string comment:string
作成されたマイグレーションファイルをデータベースに反映させます。
bundle exec rake db:migrate
scaffoldが完成しました。
twitterbootstrapのテーマを反映させる
もしも、twitterbootstrap gemが入っているなら下のコマンドでテーマを反映させます。
rails generate bootstrap:install static rails g bootstrap:layout application rails g bootstrap:themed S3images
s3にファイルを削除するためのバケットを作る
railsのセットアップも終わったのでs3にバケットを用意しましょう。
awsのs3のサイトに飛んで、
s3のサービスから「s3contents」というバケットをつくります。
s3contentsのバケットを選択してその中にimagesというフォルダを作ります。
これでs3の準備はできました。
s3へアクセスるためのaccess_keyとsecret_keyを取得する
これはjoppotの別の記事にまとめてあるのでそちらを参照してください。
これがないと、railsからs3を操作できません。
awsのs3を操作する為のaccess keyとsecret keyを取得する(IAM)
ファイルをアップロードしておく
予め、a.pngとb.pngをアップロードしておきます。
それぞれの画像のパーミッションをバブリックにしておいてください。
これで、ファイルのアップロードが完了しました
テーブルを用意する
先ほどのa.pngとb.pngに紐づくテーブルを用意しておきます。
画像ファイルのURLは人によって違うので適宜、自分のURLに編集してください。
そしたら、そのURLを元に、下のSQL文を作ります。
INSERT INTO "s3images" VALUES(4,'soccer','a.pngのURL','ball','2014-06-14 04:49:58.585749','2014-06-14 04:49:58.585749'); INSERT INTO "s3images" VALUES(5,'base ball','b.pngのURL','player','2014-06-14 04:50:15.302495','2014-06-14 04:50:26.038359');
railsのコーンソールで上のsql文を実行してレコードを作ります。
bundle exec rails db
レコードが作成されました。
s3imagesコントローラーを編集する
awsの設定コードを記述する
app/controllers/s3images_controller.rbを開いて、
クラスの中に上部に下のセッティングソースを書きます。
AWS.config(access_key_id: 'あなたのアクセスキー', secret_access_key: 'あなたのシークレットー', region: 'ap-northeast-1')
ここで、別記事で紹介しているIAMで入手した、アクセスキーとシークレットキーを入力しましょう。
regionを見ると、「ap-northeast-1」にしています。これはs3をどこに置いているかをさしています。それぞれ、確認してそれを適切に設定してください。
ちなみに、確認の仕方は、s3のサイトに言った時にURLに表示されます
destroyアクションを編集する
scaffoldで作成したdestroyアクションは下のようになっています。
def destroy @s3image.destroy respond_to do |format| format.html { redirect_to s3images_url } format.json { head :no_content } end end
これを下の様にします。
def destroy s3filepath=@s3image.file_name.gsub("http://s3-ap-northeast-1.amazonaws.com/s3contents/","") s3 = AWS::S3.new s3.buckets['s3contents'].objects[s3filepath].delete @s3image.destroy respond_to do |format| format.html { redirect_to s3images_url } format.json { head :no_content } end end
一番始めの行のところはs3のバケットから見たファイルのパスにソートしています。
例えば、カラムfile_nameに入っている「http://s3-ap-northeast-1.amazonaws.com/s3contents/images/a.png」をソートした場合は「images/a.png」になります。
あとは記述のまんまです。
これでファイルが削除できるようになりました。
実際にファイルを削除してみる
サーバを起動して
bundle exec rails s
下のURLに移動して
http://localhost:3000/s3images
a.pngを削除してみましょう。
削除したいファイルのdeleteボタンをクリックして、okを押します。
まとめ
aws独自の関数や書き方があるので、それさえ分かってしまえば簡単にできますね。