今更ながらAWSをAWS SDK for PHPで制御

開発に利用しているEC2のインスタンスを利用していないときには停止させるようにしたい…
と、思い立ち、今更ながらAWSが提供するAWS SDK for PHPを利用してみました。

AWS SDK for PHPのインストール

まずは、最新のSDKをインストールします(ブログ記載時で3.15.7) 最新のAWS SDK for PHPのインストール方法は3つありますが、Composerから入れてみます。
筆者の環境はMacですが、インストールはマニュアル通り以下の手順で問題なく完了しました。

  1. スクイプト保存用フォルダ作成
  2. フォルダ内に移動
  3. $ curl -sS https://getcomposer.org/installer | php
  4. $ php composer.phar require aws/aws-sdk-php

アカウントの準備

AWSのAPIを利用する際には、”Access Key”と”Secret Access Key”という2つのkeyが必要になります。この2つのkeyはAWSのコンソールから次の手順で事前に作成しておきます。

  1. AWSのコンソールにサインイン
  2. 上部メニューの「認証情報」選択
  3. 左メニューの「ユーザー」選択
  4. “ユーザーごとにアクセスキーを生成”にチェックをして、新規ユーザーを作成+キーをダウンロードしておく。
  5. 左メニューの「グループ」を選択
  6. 新しいグループを作成
  7. 「ポリシーのアタッチ」で、「AmazonEC2ContainerServiceFullAccess」をチェック。
  8. 作成したグループに、先に作成したユーザを追加
    上記設定で、新しく作ったキーペアで、EC2にいろいろアクセスができるようになります。
    (アクセスに制限かけたい場合は、ポリシーを変更するみたいですね)

一覧を出してみる

今回は作成済みのインスタンスの立ち上げ/下げをやりたいので、インスタンスのIDだけが必要になります。
このIDはAWSコンソールからもできますが、アクセス確認も含めて次のコードで一覧を取得しました。

<?php
require 'vendor/autoload.php';
use Aws\Ec2\Ec2Client; // EC2Client

// EC2クライアント インスタンスの生成
$ec2 = new Ec2Client([
    'version' => 'latest',
    'region' => 'ap-northeast-1', // 東京リージョン
    'credentials' => [
        'key' => '(取得したkey)',
        'secret' => '(取得したsecret key)'
    ]
]);

// 一覧を取得して表示(InstanceId, ImageId, state)
$result = $ec2->describeInstances();
if (is_array($result['Reservations']) && count($result['Reservations'])) {
    foreach ($result['Reservations'] as $items) {
        foreach ($items['Instances'] as $instance) {
            printf("%s %s %s\n", $instance['InstanceId'], $instance['ImageId'], $instance['State']['Name']);
        }
    }
}

インスタンスの開始/停止

一覧で確認したInstanceIdを指定してEC2インスタンスを開始/停止するコードはこちら。

開始
require 'vendor/autoload.php';
use Aws\Ec2\Ec2Client; // EC2Client

// EC2クライアント インスタンスの生成
$ec2 = new Ec2Client([
    'version' => 'latest',
    'region' => 'ap-northeast-1',
    'credentials' => [
        'key' => '(取得したkey)',
        'secret' => '(取得したsecret key)'
    ]
]);

// 開始
$result = $ec2->StartInstances([
    'InstanceIds' => [
        '(調べたインスタンスID)'
    ]
]);
停止
require 'vendor/autoload.php';
use Aws\Ec2\Ec2Client; // EC2Client

// EC2クライアント インスタンスの生成
$ec2 = new Ec2Client([
    'version' => 'latest',
    'region' => 'ap-northeast-1',
    'credentials' => [
        'key' => '(取得したkey)',
        'secret' => '(取得したsecret key)'
    ]
]);

// 終了
$result = $ec2->StopInstances([
    'InstanceIds' => [
        '(調べたインスタンスID)'
    ]
]);

うまくインスタンス制御ができるようになったので、cron登録をしてインスタンスの時間制御をやってみようと思います。