IAMからロールを作成しアタッチする
ユーザーのsecretキー、IDキーを作成する方法の場合キーが漏洩した際にインシデントになり得る。
なので極力ロールを作成して、それをインスタンスや、ECSのタスクにアタッチしていく。
ロールの作成方法
ロールは複数のポリシーが紐づいて構成されるのでまずポリシーを作る
サービスはS3を選択
アクションは権限を指定する、必要最低限にするべき。
画像アップロードに必要な権限は2つなのでこれだけ付与する
- PutObject
- PutObjectAcl
リソースを選択
ARNの追加をクリックするとダイアログが出るので、この権限で操作したいバケットを指定する。
バケット名はS3のバケット名をそのまま入れれば良い、この場合は hoge-fuga-piyo
リクエスト条件は空で良いがIP制限はかけても良いかもしれない。
ロールを作成する
EC2に画像アップロード権限を付与するならこちらをそのまま選択
ECSのタスクに紐づけたい場合
実は選択肢にないので、一旦EC2を選択で良い(あとで変更する)
Attachアクセス権限ポリシー
ここで、先ほど作成したポリシーを付与する。
タグはなくても良い、任意。
ECSのタスクに紐づけるばあいは、信頼関係の編集
このページの編集ボタンを押す。
ECSに紐づける設定を追記する
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
そしたらあとは簡単
ECSのタスク定義から対象のタスクを選択し、新しいリビジョンを作成
タスクロールの場所に先ほど追加したロールがあれば成功
ない場合は再度ECSに紐づける設定を追記する工程を見直す。
アプリケーションコードをちょっと修正する
AWSのキーを用いて画像をアップロードする仕組みになっていると思うので、使わない実装にする
例えばLaravelなら null に設定するなど(ライブラリ使ってます。
's3' => [
'driver' => 's3',
'key' => null,
'secret' => null,
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
],
完了
これで終わり。