はっさんブログ

フォローするとお得なブログ

さっと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: 'dummy',
    secret_access_key: 'dummy',
    endpoint: 'http://localhost:4569/',
    force_path_style: true #=> パスが 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

表示されましたね!

バケット名は愛嬌で :D