Be a Engineer.

社会人からWEBエンジニアになった人間の備忘録的勉強記録

AWS SDK for PHP を使ってみる

環境要件

  • PHP5.3.3 以上のバージョンであること
  • cURLJSONXML・OpenSSL・zlib の拡張モジュールと入れてコンパイルしていること
    • $ php -mでどのモジュールが入っているか確認可能
  • cURLモジュールは 7.16.2 以上のバージョンであること

(参考)Requirements — AWS SDK for PHP 2.8.17 documentation

インストール方法

3種類の方法がある。

  1. Composer を利用してインストールする
  2. Pharをインストールする
  3. 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サービスでも使えますので!

(参考)Namespace Aws | AWS SDK for PHP