ローカル環境のとき,AWS SDK for PHP Version 3でDynamoDBにアクセスできなくてハマったときのメモ.

環境

  • Docker php:7-apache

目標

AWS SDK for PHP でDynamoDBにアクセスしたい.

$sdk = new Aws\Sdk([
    'region'   => 'ap-northeast-1',
    'version'  => 'latest',
    'debug' => false,
]);

$dynamodb = $sdk->createDynamoDb();

起きたこと

  • EC2インスタンスやFargate上ではDynamoDBにSDK経由で上手くいくが,localhostで見たときに うまくいかない.上記のコードを実行した際に以下のエラーが出る.
Fatal error: Uncaught exception 'Aws\Common\Exception\InstanceProfileCredentialsException' with message 'Error retrieving credentials from the instance profile metadata server.
  • IAMでのInstance ProfileによりEC2インスタンスからならcredentialsファイルは不要.
  • Instance Profileがなければ,デフォルトで ~/.aws/credentials ファイルを見に行くはず.

なのでDockerfileにて

COPY ./credentials /root/.aws/credentials

としたが,やはりinstance profile がないと言われる.

結局credentialsを見てくれないということなので, AWS\Sdk() 内で 'profile': 'default' を追加した (デフォルトの設定をあえて書いただけなので意味はない). するとエラーメッセージが

Cannot read credentials from /.aws/credentials

となる.ディレクトリが / になっている.そこで,

COPY ./credentials /.aws/credentials

としたが,またも同じエラー.

むむと思い

$ ps aux | grep apache2

で調べると, www-data なるユーザーが動いている.

これは UbuntuにおけるApacheの実行ユーザー

コンテナ内のWebサーバーを実行しているユーザーがrootだと勘違いしていた.そんなわけない. credentialsファイルが読めていないのはwww-dataが読んでいるため ファイルのread権限がないからだった.

www-dataで読めるよう権限を変更する.

...
COPY ./credentials /.aws/credentials
RUN chmod -R 700 /.aws
RUN chown -R www-data:www-data /.aws

再build & run したらうまく行った.

Issueにも載っていた: Credentials - Issue #887