概要
CrowiとGrowiでやった内容だが、esa.ioも多分同じ。エンドポイントの書き方が違うくらい。
- HerokuとかDockerとかでGrowiを建てる。
- Growiで利用するS3のバケットを作る。
- IAM作ってGrowiで利用するS3だけ許可するポリシーを書く。
- Growiの管理画面でIAMの情報を入力する。
- おしまい。
なぜやるのか
Herokuの無料範囲(free Dyno)で建てるケースやDockerで運用する場合、ローカル環境に入れると消えてしまうため、MongoDBかS3かその他のストレージに入れる必要がある。
MongoDBに保存するのは抵抗があるため、S3に置きたい。
(特に無料範囲で動かす場合、ストレージのサイズがネックになる可能性が高い。)
手順
1. HerokuとかDockerとかでGrowiを建てる。
(省略)
2. Growiで利用するS3のバケットを作る。
(省略)
ブロックパプリックアクセスは全部 オフ
で問題なし。IAMで制御する。
3. IAM作ってGrowiで利用するS3だけ許可するポリシーを書く。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::{$growi}",
"arn:aws:s3:::{$growi}/*"
]
}
]
}
4. Growiの管理画面でIAMの情報を入力する。
プロフィール画像とかちゃんとアップロードできてればおk。
トラブルシューティング
ENVで FILE_UPLOAD: aws
になってることを確認
Todo
GrowiはS3のURLに対してプロキシしてくれるので、直URLは見えないものの、S3のURL直叩きするとファイルが見えてしまう問題がある。
S3のバケットポリシーでIP制限掛けるのが良いが、Herokuの無料範囲でやるとAWSのリージョンで設定されている範囲全部来る可能性があるのでちょっと現実的じゃない。
- lambdaで都度変更するfunction動かすとか
-
Growiで使ってる
aws.js
をオーバーライドするとか、改善してPR送るとか
/資料/外部仕様/S3のACL設定 - GROWI Developers Wiki https://dev.growi.org/%E8%B3%87%E6%96%99/%E5%A4%96%E9%83%A8%E4%BB%95%E6%A7%98/S3%E3%81%AEACL%E8%A8%AD%E5%AE%9A