概要
Embulkを使用して、ローカル環境にあるファイルを取り込んでいたが、そのファイルをs3から取り込む必要が出てきた。開発環境で実際のs3を使うのが良い手ではないため、fake-s3を使うことにした。
Dockerの中のfake-s3の設定とEmbulkのs3プラグインの設定を本記事に記載しておきます。
Fake-s3
Fake-s3とは?
https://github.com/jubos/fake-s3
Fake S3 is a lightweight server that responds to the same API of Amazon S3.
APIがほぼ一緒。実はAWS CLIでの操作も可能。
さて、Dockerのコンテナを作って、そこでfake-s3を起動させる。
fake-s3の最新バージョンはLicenseが必要。(有料)
お金がもったいないためもっと低いバージョンをインストールする
RUN gem install fakes3 -v 0.2.5
fake-s3のルートディレクトリーが必要なので、それを作成する
RUN mkdir -p /fakes3_root
/fakes3_rootのしたにあるディレクトリーがバケットになるので(下記のように)、事前に作っといても良い。
- fakes3_root
- bucket_name_1
- bucket_name_2
RUN mkdir -p /fakes3_root/test_bucket
最後は下記のラインをDockerfileにたす。ルートとポートを指定してfake-s3を起動させる
# run s3
CMD [ "fakes3", "-r", "/fakes3_root", "-p", "4567" ]
接続できるようにポートを開ける必要がある (docker-compose用)
expose:
- 4567
ports:
- 4567:4567
これでコンテナを起動して、ブラウザーから http://127.0.0.1:4567 をアクセスすると、XMLが表示される
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>123</ID>
<DisplayName>FakeS3</DisplayName>
</Owner>
<Buckets>
<Bucket>
<Name>bucket_name_1</Name>
<CreationDate>2019-06-24T08:54:00.000Z</CreationDate>
</Bucket>
<Bucket>
<Name>bucket_name_2</Name>
<CreationDate>2019-06-24T08:54:00.000Z</CreationDate>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
これでfake-s3が動いている状態。API又はCLIを使って、ファイルをアップロードすることが可能。
注意点
- コンテナをビルドする前にバケットの下にファイルを置いといても、それが認識されない。fake-s3を起動してからファイルをアップロードするしかないみたい。
- コンテナの中でAWS CLIをインストールして、gzipファイルをアップロードしようとするとエラーになる。(エラー内容がおかしい (Syntax error)、おそらくfake-s3のバージョンが最新ではないのが原因)自分はコンテナの外からアップロードするようにした。
Embulk
s3からファイルを取り込むプラグインが存在する。それがembulk-input-s3というプラグイン。
https://github.com/embulk/embulk-input-s3
実際のs3とfake-s3、どちらを使っても設定はほとんど一緒だがfake-s3が認証を問わない。AccessとSecret Keyの値はなんでも良い。
そして今回faka-s3が別のコンテナで動いているからproxyを設定する必要がある。
Embulkのyml.liquidファイルの設定が下記になる
in:
type: s3
bucket: {{ bucket }}
path_prefix: {{ path_prefix }}
endpoint: {{ endpoint }}
auth_method: anonymous
http_proxy:
host: fake-s3
port: 4567
bucket: 自分のバケット名
path_prefix: お好きにどうぞ
endpoint: はfake-s3の場合に http://fake-s3:4567 になる
host: fake-s3 は自分のコンテナの名前
auth_method: basicの場合はAccess/Secret Keyはなんでもいい、anonymousもそのまま動く。ただし、instanceを設定してみた時は unable to load credentials というエラーが出た。インスタンスのメソッドを諦めた。
おまけ
これでとりあえずEmbulkで別コンテナからS3プラグインを使ってファイルを取り込むようになった。
問題は色々あったが、それは多分バージョンが低いのが原因。
無料でローカルでシミュレーションができたからよしとする。