ApacheのDockerコンテナで AWS SDK からcredentialsを読ませる
ローカル環境のとき,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