はっさんブログ

技術的なまとめ・話題になっているもの・やっていきを配信する

さっとfake-s3を試す

スポンサーリンク

ゴール

  • ローカルでs3っぽいことを試す

今回は30秒だけアクセス可能なオブジェクトのURLの取得を行ってみます。

前提

  • fake s3環境を用意
  • Ruby

fake s3のDockerイメージがあるのでそれを使いましょう。
ローカルのポート4569をコンテナ内の4569に繋げます。

内容

# Dockerfile

FROM debian:jessie

ENV DEBIAN_FRONTEND noninteractive

# install Ruby
RUN apt-get update && apt-get install -yqq ruby rubygems-integration

# install fake-s3
RUN gem install fakes3

# run fake-s3
RUN mkdir -p /var/fakes3
ENTRYPOINT ["/usr/local/bin/fakes3"]
CMD ["-r",  "/var/fakes3", "-p",  "4569"]
EXPOSE 4569
# fake_s3.rb

require 'aws-sdk'
require 'fakes3'

# 実際に繋げるわけではないので、`access_key_id`、`secret_access_key`はなんでもOK
s3 = Aws::S3::Client.new(
    :access_key_id => '123',
    :secret_access_key => 'abc',
    :endpoint => 'http://localhost:4569/'
  )

# Pre-signer
signer = Aws::S3::Presigner.new(client: s3)

bucket_name = 'はっさんバケット'
upload_file = 'saru.png'

# バケット作成
s3.create_bucket(bucket: bucket_name)

# ファイルアップロード
# すでに存在している名前のファイルは上書きされる
s3.put_object(
  bucket: bucket_name,
  key:    upload_file,
  body:   File.open(upload_file)
)

# 30秒だけアクセス可能なオブジェクトのURLを取得
s3.list_objects(bucket: bucket_name).contents.each do |object|
  puts signer.presigned_url(:get_object, bucket: bucket_name, key: object.key, secure: true, expires_in: 30)
end

結果

$ ruby fake_s3.rb

http://localhost:4569/%E3%81%AF%E3%81%95%E3%81%A0%E3%81%AE%E3%81%A4%E3%82%88%E3%81%84%E3%83%90%E3%82%B1%E3%83%83%E3%83%88/saru.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=133%2F20170614%2Fap-northeast-1%2Fs3%3Faws4_request&X-Amz-Date=20170614T010321Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=d8c6ac25dcb7a0a10693f427dbd6f1e9b81827a365d4ffe1718e8ed654a54303

f:id:usgitan:20170614100702p:plain

表示されましたね!