S3 コンテンツの Basic 認証 + HTTPS 配信

S3、使ってますか？

私 S3 好きですが、たまに思います。**HTTPS ほしい[^1]**とか、**Basic 認証ほしい**とか。社内で使うにはバケットポリシーで十分ですが、お客様に見せるときに困ることあるじゃないですか？
かといって CloudFront を HTTPS や閲覧制限のためだけに用意するのも・・
EC2 ・・え、ここにきてサーバー使う・・・？っていう。

なので（Nginx や HAProxy よりも Docker で使いやすく）
それらの課題に対処できる**軽量ツール**を作りました。


# Docker イメージ[^2]

2パターンあります。

- [pottava/s3-proxy](https://hub.docker.com/r/pottava/s3-proxy/)  
バケットにアクセス権のある **クレデンシャル[^3] さえあれば** OK  
（静的 Web サイトホスティングの設定などは不要）

```sh:pottava/s3-proxy
# 必須の環境変数は `AWS_S3_BUCKET` のみ
docker run --rm -p 443:80 \
    -e AWS_REGION=ap-northeast-1 \
    -e AWS_S3_BUCKET=my-bucket \
    -e AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE \
    -e AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/bPxRfiCYEXAMPLEKEY \
    -e HTTP_CACHE_CONTROL="no-store, no-cache, max-age=0" \
    -e HTTP_EXPIRES="Thu, 01 Jan 1970 00:00:00 GMT" \
    -e BASIC_AUTH_USER=username \
    -e BASIC_AUTH_PASS=password \
    -v `pwd`/certs:/certs \
    -e SSL_CERT_PATH=/certs/cert.pem \
    -e SSL_KEY_PATH=/certs/key.pem \
    pottava/s3-proxy
```

* [pottava/proxy](https://hub.docker.com/r/pottava/proxy/)  
PROXY_URL に指定した[^4] Web サイトに リバースプロキシ  
（静的 Web サイトホスティングの設定が必要）

```sh:pottava/proxy
# 必須の環境変数は `PROXY_URL` または `PROXY_PATTERNS` のみ
docker run --rm -p 443:80 \
    -e PROXY_URL="http://web.s3-website-ap-northeast-1.amazonaws.com" \
    -e BASIC_AUTH_USER=username \
    -e BASIC_AUTH_PASS=password \
    -v `pwd`/certs:/certs \
    -e SSL_CERT_PATH=/certs/cert.pem \
    -e SSL_KEY_PATH=/certs/key.pem \
    pottava/proxy
```

いずれも Go 1.6 で実装しているため、SSL/TLS を有効にした（SSL_CERT_PATH と SSL_KEY_PATH を渡した）場合、地味ですが、**HTTP/2 での接続** になります。


# Arukas で使ってみる

Arukas のエンドポイントは **デフォルトで https** なので
上述サンプルのような SSL/TLS 証明書やその指定は不要です。


## 1. アカウントの作成

まだ β 期間中なので無料で利用できます！
https://arukas.io/


## 2. アプリケーションの作成

https://app.arukas.io/ で「新しいアプリケーションを作成」

<img width="650" alt="新しいアプリケーションを作成" src="https://qiita-image-store.s3.amazonaws.com/0/66457/01d7f4ca-3457-2a61-fffa-d09209221108.png">


## 3. アプリケーションの設定

必要な項目を埋めて「アプリケーションを作成」します。

| 項目 | 値 | 　
|:-----------|:------------|:------------|
| App Name | てきとうに
| Image | pottava/s3-proxy
| Instances | そのままでOK
| Memory | どちらでも
| Endpoint | てきとうに
| Port | 80 TCP
| ENV | AWS_REGION | S3 リージョン
| | AWS_S3_BUCKET | S3 バケット名
| | AWS_ACCESS_KEY_ID | AWS アクセスキー
| | AWS_SECRET_ACCESS_KEY | AWS シークレットキー
| | BASIC_AUTH_USER | Basic 認証ユーザー名
| | BASIC_AUTH_PASS | Basic 認証パスワード

<img width="650" alt="アプリケーションを作成" src="https://qiita-image-store.s3.amazonaws.com/0/66457/f3c0c705-4889-8860-6ea3-c67c39b7e22d.png">


## 4. アプリケーションの起動

トップページから、いま作成したアプリケーションを起動してみます。

<img width="650" alt="アプリケーションの起動" src="https://qiita-image-store.s3.amazonaws.com/0/66457/eb307c5f-8acc-1c85-2cf4-002f7fb5463c.png">


## 5. エンドポイントへの接続

アプリケーション詳細画面で「アプリは起動状態です」と表示されたら
以下の URL にアクセスしてみます。

<img width="650" alt="エンドポイントの確認" src="https://qiita-image-store.s3.amazonaws.com/0/66457/6c1a9de6-b28d-b56e-c04d-9deaf1353aeb.png">

Basic 認証かかりました？

Arukas、無料でこれができたらもちろんうれしいのですが
将来有料になっても、分単位の課金であればありがたそう！！

　

[^1]: / を /index.html などと解釈してくれる静的 Web サイトホスティングで。
[^2]: それぞれ Docker イメージではなく、クロスコンパイルしたバイナリとしても配布しています。[pottava/s3-proxy](https://github.com/pottava/aws-s3-proxy/releases) & [pottava/proxy](https://github.com/pottava/basicauth-reverseproxy/releases) 
[^3]: EC2 上であれば、インスタンスロールでも動作します
[^4]: 複数のターゲットを指定し、仮想ドメイン・パスでの振り分けもできます。こんな `PROXY_PATTERNS="/static=http://assets.cdn,*.example.com=http://app.io,*=http://sorry.com"`