TL:DR
-
~/.aws/config
に書かれたprofile
を使う場合は、AWS_SDK_LOAD_NONDEFAULT_CONFIG
を設定しなければいけない - ただし、
aws/aws-sdk-php
がv3.102.0
以降の話 - 詳しくは「AWS 認証情報ファイルと認証情報プロファイルの使用 - AWS SDK for PHP」参照のこと
詳細
以下のように、AWS
の認証設定がしてあるとします。
~/.aws/config
[profile project1]
role_arn = arn:aws:iam::123456789012:role/testing
source_profile = default
role_session_name = OPTIONAL_SESSION_NAME
~/.aws/credentials
[project2]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
で、AWS SDK for PHP
を使ったプログラムを実行すると、以下のコードあたりでエラーになります。
vendor/aws/aws-sdk-php/src/AwsClientTrait.php
public function execute(CommandInterface $command)
{
return $this->executeAsync($command)->wait();
}
私の場合は、PHPUnit
で動作確認していたのですが、コンソールに出力されるメッセージが、接続に失敗したことだけわかるような感じだったので、この解決策にたどり着くのに相当時間がかかってしまいました。
$ AWS_PROFILE=project1 vendor/bin/phpunit
1) App\Tests\ExampleTest::testMethod
GuzzleHttp\Exception\ConnectException: cURL error 28: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
ちなみに、私は前述のドキュメントではなく、下記のソースコードからAWS_SDK_LOAD_NONDEFAULT_CONFIG
が必要なことを知りました。
vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php
private static function loadProfiles($filename)
{
$profileData = \Aws\parse_ini_file($filename, true, INI_SCANNER_RAW);
// If loading .aws/credentials, also load .aws/config when AWS_SDK_LOAD_NONDEFAULT_CONFIG is set
if ($filename === self::getHomeDir() . '/.aws/credentials'
&& getenv('AWS_SDK_LOAD_NONDEFAULT_CONFIG')
) {
$configFilename = self::getHomeDir() . '/.aws/config';
$configProfileData = \Aws\parse_ini_file($configFilename, true, INI_SCANNER_RAW);
foreach ($configProfileData as $name => $profile) {
// standardize config profile names
$name = str_replace('profile ', '', $name);
if (!isset($profileData[$name])) {
$profileData[$name] = $profile;
}
}
}
return $profileData;
}
$ AWS_PROFILE=project1 AWS_SDK_LOAD_NONDEFAULT_CONFIG=1 vendor/bin/phpunit
PHPUnit 7.5.16 by Sebastian Bergmann and contributors.
Runtime: PHP 7.2.19
Configuration: /path/to/app/phpunit.xml
... 3 / 3 (100%)
Time: 4.01 seconds, Memory: 18.00 MB
OK (3 tests, 3 assertions)
補足
冒頭にも書きましたが、この記事は、aws/aws-sdk-php
がv3.102.0
以降の話です。
それ以前は、前述のCredentialProvider::loadProfiles
関数ごと存在しないです。