仕事の関係上、
AWS+EC2+S3+Laravel9という作業があり、
Laravel9上からS3を操作するのにハマったので備忘録として書いときます。
Qiita探してもstackoverflow検索してもうまいことでてこなかったので。
※公式の見解でも無く、勝手に調べたことなので参考になったら嬉しいですが、動かなくても一切責任はとりません。
結論(とりあえず)
- Laravel9 + EC2 + セキュリティ要件でAWS CLI経由でも多要素認証が入る場合、サービスロールにS3のアクセス権を割り当てる。
- Laravel9標準のFlysystem-aws-s3を使う場合、上の設定をした上で、.envの「AWS_ACCESS_KEY」と「AWS_SECRET_KEY」のエントリを行ごと(ここ重要)削除する。
経緯
- IAMユーザはコンソール入らないユーザでも多要素認証必須、という要件があり、少なくともIAMロールで逃がす必要があった。
- Laravel公式などでは、アクセスキーを使ったドキュメントくらいしかなく、ロール経由での説明がほとんど無かった。
- 以下サイトなどでENDPOINTは不要、などがあったが、ロールの場合のベストプラクティスは無かった。https://zenn.dev/nicopin/articles/e92eb4bc99cc4a
はまりポイント
- Laravel8→Laravel9で内包するfly-systemがv1→v3になっており、ロジックなども変わったようである。
https://readouble.com/laravel/9.x/en/upgrade.html - ただ、Flysystem-aws-s3の内部変更の詳細まではlaravel側に無く、 他の記事などを参考に、.envの設定値を何も付けないと、ログには何もでないがS3にはAPIが実行されない現象になっていた。
- laravel内部の挙動っぽいのでログにもうまく出せなかった。
調べたこと
- AWSアクセスキーを.envに設定する方法ではちゃんとS3への操作が通るので、基盤的な疎通の観点では問題が無いように見えた。
対処法
- IAM roleに必要なアクセス権を付ける。
- EC2インスタンスの設定で上記のIAMロールを割り当てる。
- Laravel9を動かす。
- Laravel9の.envファイルを以下のように編集する。
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=【任意のバケット名】
AWS_URL=【バケットURL】
AWS_USE_PATH_STYLE_ENDPOINT=false
下はうまく動きませんでした。
AWS credencialを優先してライブラリが見るらしく、認証が出来なくてこけるっぽい。
ログに出ないので苦労した。
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=【任意のバケット名】
AWS_URL=【バケットURL】
AWS_USE_PATH_STYLE_ENDPOINT=false
- あとは適当に動かす。
最後に
- アップグレードガイドはちゃんと読もうと思いました。
- フレームワーク内部のライブラリの仕様変更までいくと辛い。
- 多要素認証でCLIは他社がどうやってのセッションの維持をうまくやってるのか知りたい。