やりたいこと
Railsでフランス語のWebアプリを個人開発してます。
developmentではS3で画像を保存していたのですが、本番デプロイするにあたり、Lightsailでアプリを運用することにしたのでLightsailのオブジェクトストレージを使うことにしました。
元々のS3での実装がどうなってたのか、記憶から消えていたのでこの辺を読んで復習するところから始まりました。
関連する該当箇所は以下な感じです。
gem 'image_processing', '~> 1.2'
has_one_attached :image
def users_params
params.require(:user).permit(:account_name, :image)
end
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ではあるのだろうけど、どうやってやるのだろう...。
実装!
結論
いっろいろ遠回りしたけど、結論はバケットのアクセスキーみたいです。
ホーム
=> ストレージ
=> 該当のバケット
選択 => アクセス権限
=> アクセスキー
ここでアクセスキーを作成して、アクセスキー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コンソールをいじってみると。
自分がAWSで作ったIAMユーザーになってる。(ここではadmin
という名前のIAMユーザーを使っている)
このドキュメントで、ここに答えがあるかもと思ひつるを。
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はないのでポリシーの作成
ボタンから作る。)
(作ったIAMのapi_access_key, secret_access_keyをcredentialsにセットする。)
これをやってRailsサーバーを再起動して動作確認してみると、下記の通り違うエラーになりました。
Aws::S3::Errors::AccessDenied
Access Denied
今度はバケットに拒否されている模様。
空振り2:バケットのアクセス権限
デフォルトのすべてのオブジェクトはプライベートです
=> すべてのオブジェクトはパブリックで読み取り専用です
と変更してみる。
ダメ。
ちなみに一番最初のうまくいった例では、ここをすべてのオブジェクトはプライベートです
に戻してもきちんと動作しました。
最後に
なんか的外れなこと書いてたら教えてください〜😅