前提・実現したいこと
複数の AWS オーガニゼーションにアクセスするため
1つのベースアカウントから継承ロールを利用しています
~/.aws/credentials
[default] aws_access_key_id = xxxxx aws_secret_access_key = xxxxx
~/.aws/config
[default] region = ap-northeast-1 [profile staging] source_profile = default role_arn = arn:aws:iam::xxxxx:role/xxxxx
という設定で環境変数に
export AWS_PROFILE=staging
を設定して
aws s3 ls
を実行すると arn:aws:iam::xxxxx がオーナーのオーガニゼーションのバケット一覧が参照できます
この状態で aws-sdk-php でもソース内に認証情報をかかずに S3 にアクセスしたいです
発生している問題・エラーメッセージ
AWS SDK for PHP バージョン 3 での Amazon S3バケットの作成と使用
この AWS 公式のサンプルコードをコマンドラインから実行したところ
Fatal error: Uncaught Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata service. (cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)) ...
というエラーになってしまいます
該当のソースコード
test.php
php
1<?php 2require_once "vendor/autoload.php"; 3 4$s3Client = new Aws\S3\S3Client([ 5 'region' => 'ap-northeast-1', 6 'version' => 'latest' 7]); 8 9//Listing all S3 Bucket 10$buckets = $s3Client->listBuckets(); 11foreach ($buckets['Buckets'] as $bucket) { 12 echo $bucket['Name'] . "\n"; 13 break; 14} 15?>
試したこと
aws-sdk-ruby の場合は
ruby
1require "rubygems" 2require 'aws-sdk' 3 4s3 = Aws::S3::Resource.new 5 6s3.buckets.limit(10).each do |b| 7 puts "#{b.name}" 8end
このような何の設定もしないクライアントの作り方ですんなり動作します
さすがに同じ aws が作ってる aws-sdk-php と aws-sdk-ruby で
サポートする設定ファイルの記述が違うということはないと思いたいのですが
AWS 認証情報ファイルと認証情報プロファイルの使用
こちらの aws-sdk-php v3 公式ドキュメントにも
AWS_PROFILE 環境変数を設定するかクライアントをインスタンス化する際の profile オプションを選択することで、project1 で特定されたロールは、default プロファイルをソース認証情報を使用して継承されます。
とあって優先順位はインスタンスメタ情報より優先されるはずで書き方も間違ってないと思うのですが
プロファイル情報が参照されずにインスタンスメタ情報を探しに行ってエラーになっているようです
自分の設定ミス等があればご指摘いただけると幸いです
補足情報(FW/ツールのバージョンなど)
OS: MacOS X
PHP 7.3.11 (cli) (built: Jun 5 2020 23:50:40) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies
aws/aws-sdk-php: 3.154.1
あなたの回答
tips
プレビュー