2011年10月19日水曜日

EC2の状態をYAMLで出力(Gitでバージョン管理)

スズキです。

下記のセキュリティグループに続き、
セキュリティグループの状態をテキスト化&バージョン管理(Git)
今度はEC2の構成もYAMLで出力してGitで管理してGitWebで閲覧できるようにしてみました。

YAMLに出力するPHPスクリプトは下記のような感じです。

require_once("/opt/aws/php/default/sdk.class.php");

$regions = array(
  AmazonEC2::REGION_US_E1,
  AmazonEC2::REGION_US_W1,
  AmazonEC2::REGION_EU_W1,
  AmazonEC2::REGION_APAC_SE1,
  AmazonEC2::REGION_APAC_NE1
);

$yaml = yaml_parse_file("/opt/cloudpack/conf/$argv[1]/credential.yaml");
$ec2 = new AmazonEC2($yaml["accessKey"], $yaml["secretKey"]);

foreach($regions as $region) {
  $ec2->set_region($region);
  $response = $ec2->describe_instances();
  file_put_contents(
    "/opt/cloudpack/var/$argv[1]/git/ec2/$region.yaml",
    yaml_emit(json_decode($response->body->reservationSet->to_json(), true))
  );
}

exit(0);

今回は、アクセスキーやシークレットキーを下記のように
外部のYAMLファイルから取得するようにしています。
PHPでYAMLファイルの読み込み

セキュリティグループ同様、下記のようにリージョンごとにYAMLファイルが作成されます。

# ./output-ec2-create suz-lab
# ls -1 /opt/cloudpack/var/suz-lab/git/ec2/
ap-northeast-1.yaml
ap-southeast-1.yaml
eu-west-1.yaml
us-east-1.yaml
us-west-1.yaml

実際のYAMLファイルは以下の通りです。

# cat /opt/cloudpack/var/suz-lab/git/ec2/ap-northeast-1.yaml 
---
item:
  reservationId: r-00000000
  ownerId: "000000000000"
  groupSet:
    item:
    - groupId: sg-00000000
      groupName: default
    - groupId: sg-00000000
      groupName: web
  instancesSet:
    item:
      instanceId: i-00000000
      imageId: ami-00000000
      instanceState:
        code: "16"
        name: running
      privateDnsName: ip-000-000-000-000.ap-northeast-1.compute.internal
      dnsName: ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com
      reason: []
      keyName: suz-lab_ap-northeast-1
      amiLaunchIndex: "0"
      productCodes: []
      instanceType: m1.large
      launchTime: "2011-09-20T01:51:18.000Z"
      placement:
        availabilityZone: ap-northeast-1a
        groupName: []
        tenancy: default
      kernelId: aki-00000000
      ramdiskId: ari-00000000
      monitoring:
        state: enabled
      privateIpAddress: 000.000.000.000
      ipAddress: 000.000.000.000
      groupSet:
        item:
        - groupId: sg-00000000
          groupName: default
        - groupId: sg-00000000
          groupName: web
      architecture: x86_64
      rootDeviceType: ebs
      rootDeviceName: /dev/sda1
      blockDeviceMapping:
        item:
        - deviceName: /dev/sda1
          ebs:
            volumeId: vol-00000000
            status: attached
            attachTime: "2011-09-20T01:51:37.000Z"
            deleteOnTermination: "true"
        - deviceName: /dev/sdf1
          ebs:
            volumeId: vol-7833b915
            status: attached
            attachTime: "2011-09-20T01:53:46.000Z"
            deleteOnTermination: "false"
      virtualizationType: paravirtual
      clientToken: []
      tagSet:
        item:
          key: Name
          value: web01
      hypervisor: xen
  requesterId: 058890971305
...

そして適当にEC2の内容を変更して(タグを変更)、コミットして、
下記のようにGitWebで差分を確認すると
GitWebでセキュリティグループの状態を確認
次のようにセキュリティグループ同様、構成の変更がわかります。


あとは、同じパターンで増やせばいいだけ。
--------
http://www.suz-lab.com

0 コメント: