LaravelからS3を使用する際はStorageファサードでS3を操作することが多いと思う。
その際に私がググった限りでは、ほとんどがアクセスキーとシークレットキーをソースコードにべた書きしているケースばかりだった。
しかし、こちらはアンチパターンなので、ec2で上記を行う場合はIAMロールを使用して、アクセスキー等はAWS側に隠ぺいしてもおう。
ec2にIAMロールを割り当てる手順は転がっているので、ここでは割愛。
Laravel側
config/filesystems.php
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
],
.env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=<<バケット名>>
こう記載すると403エラーでS3にアクセスできなくなるので、必ず上記のように空にすること
.env
AWS_ACCESS_KEY_ID=null
AWS_SECRET_ACCESS_KEY=null
開発環境はec2じゃなくてローカルだよ~という人
その場合はキーを記載しましょう
.env
AWS_ACCESS_KEY_ID=<<アクセスキー>>
AWS_SECRET_ACCESS_KEY=<<シークレットキー>>
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=<<バケット名>>
ちなみに①
IAMロール割り当てはインスタンス内部でアクセスキー等をちゃんと持っている。
Laravelはfilesystems.phpのkeyとsecretが空だったときは、こちらを読み込むようになっているので、接続できるということですね。
aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************XXXX iam-role
secret_key ****************XXXX iam-role
ちなみに②
S3はaws-sdk-phpを使用かつ上記をすることでIAMロール割り当てで接続できるが、
他のAWSリソースの中には、aws-sdk-phpではダメでaws-sdk-php-laravelを使用しないと接続できないものがあるらしい。