一般社団法人 全国個人事業主支援協会

COLUMN コラム

  • AWS SDK for javaでS3にアクセスできなくなって色々調べたら色々学んだ

私が個人開発で開発しているJavaアプリでは、S3からファイルをダウンロードする処理があります。

その処理がある日いきなりAWSの認証が通らずにエラーになり始めました。

問題は解決できたんですが、正直なところ、原因はよく分かっていません。

エンジニア失格や……。

 

ただ、学びが色々あったので共有です。

エラー内容

エラーは以下です。

com.amazonaws.services.s3.model.AmazonS3Exception: User: arn:aws:iam::123456789012:user/static-s3-user is not authorized to perform: s3:GetObject on resource: “arn:aws:s3:::${ドメイン}/${パス}/${ファイル名}” with an explicit deny in an identity-based policy (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8PBZG6G3HHEK3KMZ)

バケットポリシーか、IAMユーザの許可ポリシーらへんでDENYが指定されていてアクセスできていないっぽい感じのエラー内容です。

改めてAWSの設定を見直してみましたがそんな設定はしていません。

 

てか、それまでは普通にアクセスできていましたし、設定の変更はしていません。

 

うーん…。なんだろう

解決した方法

結論から言うと、IAMユーザを作成し直したら認証が通るようになりました。

元々使用していたユーザと同じく、IAMユーザの許可ポリシーは同じもの(AmazonS3FullAccess)を指定していますし、なんで認証が通るようになったのか謎です。

一応、元々使用していたユーザでアクセスキーを再生成してみたり、バケットポリシーをより明示的に許可するように修正したり、CloudFront経由でアクセスしてるのでそのキャッシュを削除して見たり、色々考え付くことはすべて試したんですが、全部無意味で、なんかユーザ再作成でいけちゃいました。

 

これはAWSを本腰入れて学習すれば原因が分かるものなのだろうか?

 

色々調べる上で気づいたこと

AWS SDK for javaのバージョンが上がっている…!!

AWS SDK for javaのMaven依存関係のバージョンを上げてSpring Bootを起動させたら、以下のログが出ていました。

The AWS SDK for Java 1.x entered maintenance mode starting July 31, 2024 and will reach end of support on December 31, 2025. For more information, see https://aws.amazon.com/blogs/developer/the-aws-sdk-for-java-1-x-is-in-maintenance-mode-effective-july-31-2024/

 

1.x系はもう古いのかよ!!

2.xで実装し直しました。

 

Mavenは以下です。パッケージも変わっています。

https://mvnrepository.com/artifact/software.amazon.awssdk/s3/2.28.19

 

以下のURLを参考に書けば結構いけます。

https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html

https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/java_s3_code_examples.html

Objectを扱うRequestにはkey()というメソッドがありますが、ここにはS3上の”パス”を指定するようです。

(ディレクトリの概念がありそうでないS3の場合、パスという表現は不適切なんだろうけど、まぁこっちの方が伝わるだろう…。)

PutObjectRequest putObj = PutObjectRequest.builder()
    .bucket(bucketName)
    .key(objectKey) // バケット上のファイルまでの"パス"を指定
    .build();

 

やばいGitHub上でシークレットアクセストークン管理してた…

トークン修正してコミットしようとしたときGit君に

「え…君、シークレットアクセストークンコミットしようとしてる?それは流石にやばいて。やろうとしてることの意味理解しとるん???」

と言われて気が付きました。

 

プロジェクトを非公開にしていたとはいえ、GitHub上でシークレットアクセストークンを管理するのはやばい…。

個人開発かつprivateとはいえ流石に良くない。

 

Springのapplication.ymlに環境変数のキー名を書き、シークレットアクセストークンは環境変数で管理するように修正しました。

多分これが一番分かりやすいパターン。

 

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア