これは、インスタンス プロファイルを使用したポリシー ドキュメントの署名に関する以前の質問の補足です。
S3 バケットにドラッグ アンド ドロップで直接アップロードできるシステムを開発しています。AJAX 要求は、最初にファイル メタデータを含むサーバーに対して行われます。検証が完了すると、サーバーはアップロードを完了するために使用されるフォーム パラメータで応答します。
ブラウザ ベースのアップロードをセットアップするプロセスは、こちらで詳しく説明されており、ローカルのテスト環境ではすべて期待どおりに動作します。
ただし、アプリケーションが EC2 インスタンスにデプロイされると、ブラウザがファイルをアップロードしようとすると、次のエラーが表示されます。
<Error>
<Code>InvalidAccessKeyId</Code>
<Message>The AWS Access Key Id you provided does not exist in our records.</Message>
<RequestId>...</RequestId>
<HostId>...</HostId>
<AWSAccessKeyId>ASIAxxxyyyzzz</AWSAccessKeyId>
</Error>
ここの値は、メタデータ サービスから取得しASIAxxxyyyzzz
たインスタンス ロールの credentialsから取得されます。ブラウザベースのアップロードを容易にするために、これらの資格情報を EC2 の外部で使用することはできないようです。
これを行うことで、一時的な資格情報の別のセットを生成するために、 Security Token Serviceも調べました。
$token = $sts->assumeRole(array(
'RoleArn' => 'arn:aws:iam::xyz:role/mydomain.com',
'RoleSessionName' => 'uploader',
));
$credentials = new Credentials($token['Credentials']['AccessKeyId'], $token['Credentials']['SecretAccessKey']);
この呼び出しにより、新しい資格情報のセットが提供されましたが、それを使用すると上記と同じエラーが発生します。
誰かがこれを以前にやったことがあり、私が見逃したばかげたことを教えてくれることを願っています:)