14
11

More than 3 years have passed since last update.

LaravelでS3を操作する時はアクセスキー&シークレットキーではなくIAMロールを使うこと

Posted at

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を使用しないと接続できないものがあるらしい。

14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11