joppot

コピペで絶対動く。説明を妥協しない

サーバ プログラミング

railsのaws-sdk gemを使ってs3のファイルを削除する

投稿日:2014年6月15日 更新日:

Pocket

by martinak15

by martinak15

概要

みなさんこんにちは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

SPONSORED LINK


aws-gemを用意する

適当なプロジェクトを作成して、そのGemfileに下の内容を書き込みましょう。
私はbootstrap3というプロジェクトを使います。

gem 'aws-sdk'

gemaws

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のサイトに飛んで、
indexs3

s3のサービスから「s3contents」というバケットをつくります。

createnewbucket

作成できました。
s3contentsbucket

s3contentsのバケットを選択してその中にimagesというフォルダを作ります。

imagesfolderins3

これでs3の準備はできました。

s3へアクセスるためのaccess_keyとsecret_keyを取得する

これはjoppotの別の記事にまとめてあるのでそちらを参照してください。
これがないと、railsからs3を操作できません。

awsのs3を操作する為のaccess keyとsecret keyを取得する(IAM)


ファイルをアップロードしておく

予め、a.pngとb.pngをアップロードしておきます。

uploadaandb

それぞれの画像のパーミッションをバブリックにしておいてください。

everyonepermission

これで、ファイルのアップロードが完了しました


テーブルを用意する

先ほどのa.pngとb.pngに紐づくテーブルを用意しておきます。

a.pngとb.pngのURLを確認します。
apngfileurl

画像ファイルの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

レコードが作成されました。

tables


s3imagesコントローラーを編集する

awsの設定コードを記述する

app/controllers/s3images_controller.rbを開いて、
クラスの中に上部に下のセッティングソースを書きます。

AWS.config(access_key_id: 'あなたのアクセスキー', secret_access_key: 'あなたのシークレットー', region: 'ap-northeast-1')

ここで、別記事で紹介しているIAMで入手した、アクセスキーとシークレットキーを入力しましょう。

したのような感じになると思います。
inputexample

regionを見ると、「ap-northeast-1」にしています。これはs3をどこに置いているかをさしています。それぞれ、確認してそれを適切に設定してください。
ちなみに、確認の仕方は、s3のサイトに言った時にURLに表示されます

s3url

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を押します。

deleteafile

レコードが削除されます。
deleterecord

s3に上がっているa.pngも削除されています。
thereisnoafile


まとめ

aws独自の関数や書き方があるので、それさえ分かってしまえば簡単にできますね。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-サーバ, プログラミング
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

processingで重複しないランダムな数を配列で取得する

概要 みなさんこんにちはcandleです。今回はprocessingで重複しないランダムな数を配列で取得する関数を作成したいとおもいます。 前提 なし

railsのcoffee scriptをurl判定をして実行をする方法

概要 みなさんこんにちはcandleです。 今回はcoffeescriptを任意のURLで実行する様にする関数を作ります。 というのはrailsは最終的にassetspiplineでjavascrip …

sshコマンドをaliasかssh configを使って短縮する

概要 みなさんこんにちはcandleです。今回はsshの接続先のホスト名を短くする方法です。 ssh接続は非常に強力なネットワークツールですが、接続先の指定がやや面倒ですね。それを単純にする方法をまと …

ubuntuでnginxの起動と最低限のコマンド

概要 今回は、nginxの起動と最低限のコマンドをまとめました。 前提 nginxがインストールされている nginxの起動と停止と再起動 nginxはインストールした当初の設定ではubuntuを起動 …

CentOSのfluentdでapacheのaccess logとerror logを取得する

概要 みなさんこんにちはcandleです。今回はapacheのアクセスログとエラーログをfluentdを使って取得して見たいと思います。 前提 一台のサーバ上にapacheサーバとfluentdサーバ …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ