0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

やりたいこと

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

12ヶ月無料だって。やったー!
Capture d’écran 2022-01-08 à 16.46.21.png

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

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

Gemfile
gem 'image_processing', '~> 1.2'
user.rb
  has_one_attached :image
users_controller.rb
  def users_params
    params.require(:user).permit(:account_name, :image)
  end
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’écran 2022-01-08 à 15.25.33.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

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

空振り1:アカウントの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’écran 2022-01-08 à 14.29.39.png

自分がAWSで作ったIAMユーザーになってる。(ここではadminという名前のIAMユーザーを使っている)
Capture d’écran 2022-01-08 à 16.36.34.png

お、APIアクセスキー。
Capture d’écran 2022-01-08 à 14.29.53.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ユーザーはAdministratorAccessProvides full access to AWS services and resources.だから既に"full access"ある...うーん。

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

(既存のポリシーにLightsailはないのでポリシーの作成ボタンから作る。)
Capture d’écran 2022-01-08 à 14.08.41.png

(作ったIAMのapi_access_key, secret_access_keyをcredentialsにセットする。)
Capture d’écran 2022-01-08 à 14.09.22.png

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

Aws::S3::Errors::AccessDenied
Access Denied

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

空振り2:バケットのアクセス権限

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

ダメ。

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

最後に

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

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?