【学習記録】ECSからS3にアクセスできない問題が発生して、解決できた

写真投稿系のアプリケーションをAWS上にデプロイしていて、画像投稿機能が動かなくていろいろ試して直せました。
AWS環境のデバッグは知見がなくて大変時間かかりましたが、こういう経験がスキル高めるのに役立つと思うので引き続きコード書いていきます。

構築しているAWS環境

  • フロントエンド S3(Vue CLI)
  • バックエンド ECS Fargate(Golang)
  • DB RDS(MySQL)

アプリの機能

画像一覧表示機能(カテゴリー別、投稿順など)、ログイン機能、写真投稿機能などを実装。

発生した問題

画像投稿機能が500エラーになる。

画像投稿APIの概要

画面から画像データを受け取って、S3バケット(Vue CLIをデプロイしているバケットとは別)に画像をアップロードして、アップロードしたURLをDBに格納する。
そのため画像投稿APIの処理の中で、ECSからS3(画像置く用)とECSからRDSへの通信が発生する。

トラブルシューティング

まずはひとつずつ問題を切り分けました。

  • AWSリソース間の通信 画像表示機能などは問題なく動いているので、フロントエンド用S3-ECS間の接続とECS-RDSの接続は問題なさそう。
    となるとECS-画像保存用S3の通信が怪しい。

  • プログラムの不備
    プログラムに問題があるかと考え、一度ローカル環境から実行してみたところ想定通りにS3に画像が保存されたので、プログラムの処理は問題なさそう。

  • 権限周り
    IAM権限の問題かと考え、ECSタスクロールにS3にオブジェクトをアップロードできる権限を追加で付与。
    するとエラーメッセージが少し変わりましたが、まだ500エラーになっています。
    ただ、エラーになってはいるものの権限の設定自体は必要だったと思うのでこの操作も必要なものだったと考えてます。

  • 認証情報
    ローカルでは.envファイルにAWSアクセスキーの情報などを記述していますが、それがECS Fargateに渡せていないかもと考えました。
    ECSへのアクセスキーの渡し方とか曖昧な部分があるので調べ直しました。
    下記記事が非常にわかりやすかったので参考にしながら初めてAWS Systems Managerをマネジメントコンソースから開いて、パラメータストアを作成してAWSのアクセスキー情報などを設定しました。

dev.classmethod.jp

解決

パラメータストア作成後、Fargateのタスクに環境変数を追加し、ValueFromで作成したパラメータストアを指定。

そしてECSのサービスを更新して再度画像投稿機能を動かしてみると、無事画像が投稿されました。

どうやら権限の設定と認証情報の展開に問題があったようです。
いろいろ試してだいぶ疲れましたが、なんとか解決できたので成長できた手応えありです。