Amazon Lightsailのオブジェクトストレージバケットにユーザー画像を保存する

## やりたいこと
Railsでフランス語のWebアプリを個人開発してます。
developmentではS3で画像を保存していたのですが、本番デプロイするにあたり、Lightsailでアプリを運用することにしたのでLightsailのオブジェクトストレージを使うことにしました。

12ヶ月無料だって。やったー！
![Capture d’écran 2022-01-08 à 16.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/2ae5d000-4007-a379-799a-266b2f8ee56e.png)

元々のS3での実装がどうなってたのか、記憶から消えていたのでこの辺を読んで復習するところから始まりました。

https://railsguides.jp/active_storage_overview.html

関連する該当箇所は以下な感じです。

```ruby:Gemfile
gem 'image_processing', '~> 1.2'
```

```ruby:user.rb
  has_one_attached :image
```

```ruby:users_controller.rb
  def users_params
    params.require(:user).permit(:account_name, :image)
  end
```

```yml:config/storage.yml
amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: ap-northeast-1
  bucket: MY_BUCKET_NAME
```

どこかでS3クライアント作ったり、PutObjectとかしているのかと思ったらやってなくてgemがいい感じにしてくれているみたい...。今回大事なのはconfig/storage.ymlで、というか**だけ**で、AdministratorAccessのあるIAMユーザーのアクセスキーを渡していました。

Lightsailのオブジェクトストレージも結局実態はS3ではあるのだろうけど、どうやってやるのだろう...。

## 実装！

### 結論
いっろいろ遠回りしたけど、結論はバケットのアクセスキーみたいです。

`ホーム` => `ストレージ` => 該当の`バケット`選択 => `アクセス権限` => `アクセスキー`

![Capture d’écran 2022-01-08 à 15.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/90316637-7793-5d8f-35f5-3476e6f503ff.png)

ここでアクセスキーを作成して、アクセスキーIDとシークレットアクセスキーを取得し、今まで環境変数なり、credentialsなりで、IAMのaccess_key_idとsecret_access_keyをセットしていたところを置き換えます。

これだけです。

一応ドキュメントはこれになるぽいです。操作は簡単なので、これ見なくてもできますが。
https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-creating-bucket-access-keys

以上で終了ですが、参考までに以下に空振りしたものも書いておきます。

### 空振り１：アカウントのAPIアクセスキー

当初こうやって怒られていました。

>`Aws::S3::Errors::SignatureDoesNotMatch at /
The request signature we calculated does not match the signature you provided. Check your key and signing method.`

そういえば、Lightsailをいじり始めた当初からLightsailと他のAWSサービスって画面が違うし、IAMとかどうなるんだろう？と疑問に思っていたのですよね。Lightsailコンソールをいじってみると。

右上にアカウントというメニューがある。
![Capture d’écran 2022-01-08 à 14.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/8bfe60c5-244a-60d6-e077-aad0655437d1.png)

自分がAWSで作ったIAMユーザーになってる。（ここでは`admin`という名前のIAMユーザーを使っている）
![Capture d’écran 2022-01-08 à 16.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/f27b628b-fd4a-6bae-4bed-3f763e0518a2.png)

お、APIアクセスキー。
![Capture d’écran 2022-01-08 à 14.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/17a10a40-ff52-91c1-16c2-a8d1aefb7c5c.png)

このドキュメントで、ここに答えがあるかもと思ひつるを。
https://lightsail.aws.amazon.com/ls/docs/en_us/articles/lightsail-how-to-set-up-access-keys-to-use-sdk-api-cli

> Choose the name of the user for which you want to create an access key. The user you choose should have full access or specific access to Lightsail actions.

IAMユーザーはフルアクセスかLightsailのactionsに対するアクセス権限を持ってないとダメと書いてありますが、このLightsailに使われているIAMユーザーは`AdministratorAccess`で`Provides full access to AWS services and resources.`だから既に"full access"ある...うーん。

試しに新規でIAMユーザーを作って、明確にLightsailを許可するポリシーをアタッチしてそのアクセスキーをセットしてみる。

（既存のポリシーにLightsailはないので`ポリシーの作成`ボタンから作る。）
![Capture d’écran 2022-01-08 à 14.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/c20783ed-a389-6dd1-ad48-adce74fda08d.png)

（作ったIAMのapi_access_key, secret_access_keyをcredentialsにセットする。）
![Capture d’écran 2022-01-08 à 14.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/6c7af12f-cd3a-9328-0316-048817a3e3b8.png)

これをやってRailsサーバーを再起動して動作確認してみると、下記の通り違うエラーになりました。

>`Aws::S3::Errors::AccessDenied`
`Access Denied`

今度はバケットに拒否されている模様。

### 空振り２：バケットのアクセス権限

デフォルトの`すべてのオブジェクトはプライベートです` => `すべてのオブジェクトはパブリックで読み取り専用です`と変更してみる。

ダメ。

ちなみに一番最初のうまくいった例では、ここを`すべてのオブジェクトはプライベートです`に戻してもきちんと動作しました。

### 最後に
なんか的外れなこと書いてたら教えてください〜😅