web-dev-qa-db-ja.com

S3からオブジェクトをダウンロードするAWSエラー、「プロファイルファイルをnullにすることはできません」

私はすでに this を見ましたが、私の問題を説明する答えはありませんでした。最初に提供されたサンプル here (GetObjectクラス)を使用し、デスクトップですぐに動作しました。しかし、私の友人は自分のマシンで動作させることも、EC2インスタンスで動作させることもできませんでした。

資格情報ファイルを指定する必要があると言われましたが、これは理にかなっていますが、それを行う必要はなく、このバケットへのアクセスを有効にするためにデフォルトの権限が設定されたことは確かです。

スタックトレースは次のとおりです。

Exception in thread "main" Java.lang.IllegalArgumentException: profile file cannot be null
    at com.amazonaws.util.ValidationUtils.assertNotNull(ValidationUtils.Java:37)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.Java:142)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.Java:133)
    at com.amazonaws.auth.profile.ProfilesConfigFile.<init>(ProfilesConfigFile.Java:100)
    at com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.Java:135)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.Java:1029)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.Java:1049)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.Java:949)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.Java:662)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.Java:636)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.Java:619)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.Java:587)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.Java:574)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.Java:446)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.Java:4035)
    at com.amazonaws.services.s3.AmazonS3Client.getBucketRegionViaHeadRequest(AmazonS3Client.Java:4474)
    at com.amazonaws.services.s3.AmazonS3Client.fetchRegionFromCache(AmazonS3Client.Java:4448)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.Java:4020)
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.Java:1307)
    at GetObject.main(GetObject.Java:26)

GetObjectRequestのbucketNameもkey paramsもnullでないことを保証できます。ここの不一致は何ですか?自分のPCでのみ成功するのはなぜですか?これは、aws-sdk jarに既にあるはずの多数のjar(jackson-databind、jackson-core、jackson-annotations、httpclient、httpcore、commons-logging、およびjoda-時間)?それ以外の場合は説明できないエラー(非nullパラメーターを与える、aws-sdkの何かがそれがnullであると言っている)と同様です。

17
Xenalin

あなたはコメントでこれを解決したように見えますが、私はこれに熱中し、将来の読者のために明確な答えを残したいと思います。 ここでの問題はS3のファイルとは関係ありません。このエラーメッセージには、ハードドライブ上のファイルまたはS3からプッシュ/プルしようとしているファイルに関係するnothingがあります。問題は、次のようなものでS3を初期化することです。

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());

これを行うと、〜/ .aws/credentialsでプロファイルのリストが検索されます。これはコンピューター上ではうまく機能するかもしれませんが、IAMロール(例:Lambda、Docker、EC2インスタンスなど)を介してAWSアクセスを取得している場所では機能しません。修正は、次のようにAmazonS3Clientを初期化することです。

AmazonS3 s3Client = new AmazonS3Client();

何らかの資格情報プロバイダーを必要とするコードを使用している場合は、次のこともできます。

AmazonS3 s3Client = new AmazonS3Client(DefaultAWSCredentialsProviderChain.getInstance());

うまくいけば、それは次の人を助ける。私の場合、DynamoDBとSQSを使用していましたが、同じエラーが発生しました。私はあなたの問題がS3関連であり、非常に混乱していると思ったため、もともとこの質問を無視しました。手首が平手打ち。

39

ライアンによるトップの投票された答えは私を正しい軌道に乗せましたが、AmazonS3Clientが非推奨になったため、このコードは私のために問題を解決しました

    AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                  .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                  .build();

このコードは、LambdaなどでアクティブなIAMロールを正しく選択しているようです。

5
Jonathan

その理由は、友人のコンピューターに「資格情報」ファイルがないためです。

問題を解決するには、ファイルを作成します。

C:\Users\USERNAME \.aws\credentials"

windowsの場合、またはファイルを作成します。

~/.aws/credentials

macOS、Linux、またはUnix用。そして書く

aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key"

ファイルに。

または、aws_access_key_idおよびaws_secret_access_keyの環境変数を設定することもできます。

3
Aragorn