認証情報の食い違いを調べる
例えば、ローカルで AWS CLI を使って S3 の情報にアクセスできているのに、AWS SDK 使った Node.js プログラムで S3 にアクセスしたときに Access Denied (403) になるときは、異なる認証情報 (credentials) を使ってアクセスしている可能性 があります。
AWS CLI が、どのようなユーザーでアクセスしているかは、下記のようにして確認できます。
次に、Node.js のプログラムなどで、AWS SDK を使って上記と同様の情報を取得します。
Node.js 用の SDK ver.2 では、AWS.STS.getCallerIdentity()
、SDK ver.3 では STSClient.send()
を使います。
上記の結果と aws sts get-caller-identity
の結果を比べると、別のユーザー (credential) でアクセスしていることが分かります。
つまり、AWS SDK 対して、正しく認証情報 (credentails) を設定してやれば問題は解決するはずです。
AWS CLI に設定されている認証情報は、aws configure list
コマンドなどで確認できます。
(おまけ)今回の原因
ちなみに、今回の Access Denied (403) の原因は、AWS CLI では Assume Role したユーザーでアクセスできていたけれど、AWS SDK の方は直接アクセスしていたので弾かれていたというオチでした。
AWS SDK で Assume Role したいときは、AWS.SMS
オブジェクトの assumeRole
メソッドを使います。
例えば、下記のような感じで Assume Role して取得した認証情報をセットしてから、S3 などの API を呼び出せば、うまくアクセスできるようになります。
複雑すぎでしょ・・・(´へ`;
(おまけ)Access Key Id の情報を調べる
次のようにすれば、AWS SDK が使用しようとしているアクセスキーの ID を調べることができます。 この情報もトラブル発生時のヒントになるかもしれません。
関連記事
- AWS CloudFormation の設定例: SNS トピックを Lambda 関数からサブスクライブする
- AWS SNS トピックから通知されるイベントデータの例
- Lambda 実装例: S3 へのアップロードを SNS で通知して Lambda から読み込む
- AWS CloudFormation で SNS トピックのリソースを生成する
- AWS CloudFormation の設定例: S3 通知を SNS トピックに Publish する
- AWS CloudFormation の設定例: Lambda 関数から S3 にアクセスできるようにする
- AWS CloudFormation で S3 バケットのリソースを作成する