AWS SDK for PHP を使ってみる
環境要件
- PHP5.3.3 以上のバージョンであること
- cURL・JSON・XML・OpenSSL・zlib の拡張モジュールと入れてコンパイルしていること
- ※
$ php -m
でどのモジュールが入っているか確認可能
- ※
- cURLモジュールは 7.16.2 以上のバージョンであること
(参考)Requirements — AWS SDK for PHP 2.8.17 documentation
インストール方法
3種類の方法がある。
- Composer を利用してインストールする
- Pharをインストールする
- Zipファイルをダウンロードして使う
AWS SDK for PHPライブラリのバージョン管理ができて依存関係が簡単に解決できるComposerがAWS的にも推奨されているのでComposerを使った方法を紹介する。
(参考)Installation — AWS SDK for PHP 2.8.17 documentation
ComposerでAWS SDK for PHPを使う
公式ドキュメントと重複する部分もあるが、全体の流れを追うということで紹介。 ※ composerはcpanやBundlerなどと違ってバージョンが5.3.2以上のPHPが入っていれば使える。 (実際は細かい拡張モジュールが必要らしいが、公式ドキュメントにすら詳細が書かれていないので、エラーが表示されたら残念ぐらいの気持ちで良さそう)
1. composer.pharをダウンロードする
$ curl -sS https://getcomposer.org/installer | php
これでcomposer.phar
がカレントディレクトリにダウンロードされる。
2. composer.jsonを作成する
composer.jsonは1のコマンドを実行させても作成されるわけではない。 新たに自分で作成し、インストールする AWS SDK for PHP の情報とそのバージョンを書く。
{ "require": { "aws/aws-sdk-php": "2.*" } }
3. インストール開始
$ php composer.phar install
これで AWS SDK for PHP のライブラリ本体がvender/
以下にインストールされる。
4. 実際にSDKを利用するスクリプトでロードして利用する
<?php require(dirname(__FILE__).'/../vendor/autoload.php'); // ↑公式とは書き方を変えている。requireはスクリプトを実行しているディレクトリが基準になるので、安易に相対パスを使うと痛い目に遭うことが多いため。
5. credential情報を取得するためにIAMユーザーを作成する
あんまりこの記事で伝えたいところでもないので、割愛。 参考となる公式記事はこちら
- ここでアクセスキーとシークレットアクセスキーを取得しておく
- 作成したユーザーの管理ポリシーは(状況のよりけりなので選定する必要があるが)以下のようなポリシーをアタッチしておく
- AmazonRoute53DomainsFullAccess
- AmazonRoute53FullAccess
6. credential情報を使う
SDKクライアントオブジェクトを生成するために、アクセスが許可されているユーザーなのか(credential情報)やどこリージョンにリクエストを送るのか等の情報を付与する必要がある。 その情報の与え方が複数あるようで。
1. ~/.aws/credentials
ファイルに情報を記載するパターン
~/.aws/credentials
[project1] // ① aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
hogehoge.php
<?php require(dirname(__FILE__).'/../vendor/autoload.php'); use Aws\Route53\Route53Client; $client = Route53Client::factory(array( 'profile' => 'project1', // ① ));
2. 設定ファイルを作成して、コンストラクタに食わせるパターン
config.php
<?php return array( 'includes' => array('_aws'), 'services' => array( 'default_settings' => array( 'params' => array( 'credentials' => array( 'key' => 'YOUR_AWS_ACCESS_KEY_ID', 'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', ), 'region' => 'us-east-1' // Route 53 の場合。他はこちら参照→http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html ) ) ) );
hogehoge.php
<?php require(dirname(__FILE__).'/../vendor/autoload.php'); use Aws\Route53\Route53Client; $client = Route53Client::factory('path/to/config.php');
3. credentialオブジェクトを生成してコンストラクタに食わせるパターン
hogehoge.php
<?php require(dirname(__FILE__).'/../vendor/autoload.php'); use use Aws\Route53\Route53Client; use Aws\Common\Credentials\Credentials; $credentials = new Credentials('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY'); $client = Route53Client::factory(array( 'credentials' => $credentials ));
4. 生で書くパターン
hogehoge.php
<?php require(dirname(__FILE__).'/../vendor/autoload.php'); use use Aws\Route53\Route53Client; $client = Route53Client::factory(array( 'credentials' => array( 'key' => 'YOUR_AWS_ACCESS_KEY_ID', 'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', ) ));
7. あとはAPIのメソッドドキュメント眺めてAPI叩いて楽しむ
ドキュメントを読むと色々できて夢広がる感じの時が、一番楽しいポイントですよねー 色々できそうですが、ホストゾーン内のリソースレコードをCRUD操作するコードを書いたので参考までにベロっと貼っておきます。
(参考)Class Aws\Route53\Route53Client | AWS SDK for PHP
hogehoge.php
<?php require(dirname(__FILE__).'/../vendor/autoload.php'); use Aws\Route53\Route53Client; $client = Route53Client::factory(array( 'profile' => 'someproject', )); /* レコード一覧取得 */ try { // http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Route53.Route53Client.html#_listResourceRecordSets $res = $client->listResourceRecordSets(array( 'HostedZoneId' => 'Host Zone ID をコンソールから調べて記述', )); foreach ($res['ResourceRecordSets'] as $record) { echo $record['Name']."\n"; } } catch (Exception $e) { // 例外クラスは大量にあるので、エラー処理難しそう。。 // http://docs.aws.amazon.com/aws-sdk-php/v2/api/namespace-Aws.Route53.Exception.html echo $e->getMessage(); } /* レコード追加 */ try { // http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Route53.Route53Client.html#_changeResourceRecordSets $client->changeResourceRecordSets(array( 'HostedZoneId' => 'Host Zone ID をコンソールから調べて記述', 'ChangeBatch' => array( 'Comment' => 'from my PHP script', 'Changes' => array( array( 'Action' => 'CREATE', // string: CREATE | DELETE | UPSERT 'ResourceRecordSet' => array( 'Name' => 'www.hogehoge.com', 'Type' => 'A', 'TTL' => 86400, 'ResourceRecords' => array( array( 'Value' => 'some IP address', ), ), ), ), ), ), )); } catch (Exception $e) { echo $e->getMessage(); } /* レコード変更 */ try { $client->changeResourceRecordSets(array( 'HostedZoneId' => 'Host Zone ID をコンソールから調べて記述', 'ChangeBatch' => array( 'Comment' => 'from my PHP script', 'Changes' => array( array( 'Action' => 'UPSERT', // string: CREATE | DELETE | UPSERT 'ResourceRecordSet' => array( 'Name' => 'www.shirakiya.com', 'Type' => 'A', // UPSERT の場合でも必要 'TTL' => 7200, 'ResourceRecords' => array( array( 'Value' => 'some IP address', // UPSERT の場合でも必要 ), ), ), ), ), ), )); } catch (Exception $e) { echo $e->getMessage(); } /* レコード削除 */ try { $client->changeResourceRecordSets(array( 'HostedZoneId' => 'Host Zone ID をコンソールから調べて記述', 'ChangeBatch' => array( 'Comment' => 'from my PHP script', 'Changes' => array( array( 'Action' => 'DELETE', // string: CREATE | DELETE | UPSERT 'ResourceRecordSet' => array( 'Name' => 'www.shirakiya.com', 'Type' => 'A', // DELETE の場合でも必要 'TTL' => 7200, 'ResourceRecords' => array( array( 'Value' => 'some IP address', // DELETE の場合でも必要 ), ), ), ), ), ), )); } catch (Exception $e) { echo $e->getMessage(); }
これでいい感じにRoute 53のレコード管理ができると思います。 今回はRoute 53だけ紹介しましたが、もちろん他のAWSサービスでも使えますので!