TOP > 読み物 > PHPからAmazon Route 53を試す

PHPからAmazon Route 53を試す

@kunitに教えてもらったAmazon Route 53ですが、まだ基本的なAPIしかないようで(2010年12月22日現在)、 かつ、送受信用スクリプトもPerl+curlのものしか紹介されてないみたいなので PHP用のサンプル作ってみました。

誰かちゃんとしたウェブサービス作ってくんないかなー

<?php
// route53.php
// Copyright (C) Satoshi Yamada <s-yamada-nospam@dotAster.com>

$debug = 0;

$aws_access_key_id = "YOUR ACCESS KEY ID";
$aws_secret_access_key = "YOUR SECRET ACCESS KEY";

$date_url = "https://route53.amazonaws.com/date";
$base_url = "https://route53.amazonaws.com/2010-10-01/hostedzone";

$method = strtoupper($argv[1]);
if (!$method) $method = 'LIST';

$curl = curl_init($date_url);
curl_setopt_array($curl, array(
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HEADER => true,
  CURLOPT_NOBODY => true,
));
$response = curl_exec($curl);
curl_close($curl);

if (!preg_match('/Date:\s+([[:print:]]+)\r/', $response, $matches)) {
  return;
}
$date = $matches[1];
$sign = base64_encode(hash_hmac('sha256', $date, $aws_secret_access_key, true));

$opt = array(
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER     => array(
    "Content-Type: text/xml; charset=UTF-8",
    "Date: $date",
    "X-Amzn-Authorization: AWS3-HTTPS AWSAccessKeyId={$aws_access_key_id},Algorithm=HmacSHA256,Signature={$sign}",
  ),
);

if ($debug) {
  $opt[CURLOPT_VERBOSE]     = true;
  $opt[CURLOPT_HEADER]      = true;
  $opt[CURLINFO_HEADER_OUT] = true;
}

switch ($method) {
case 'LIST':
  break;
case 'GET':
  $base_url .= "/{$argv[2]}";
  break;
case 'POST':
  $opt[CURLOPT_POST]       = true;
  $opt[CURLOPT_POSTFIELDS] = file_get_contents($argv[2]);
  break;
case 'DELETE':
  $opt[CURLOPT_CUSTOMREQUEST] = 'DELETE';
  $base_url .= "/{$argv[2]}";
  break;
}

$curl = curl_init($base_url);
curl_setopt_array($curl, $opt);
$response = curl_exec($curl);

if ($debug) {
  $ret = curl_getinfo($curl, CURLINFO_HEADER_OUT);
  echo "Request:\n";
  echo "$ret\n";
  echo "Response:\n";
}

curl_close($curl);

echo "$response\n";

// vi:ts=8 sw=2
?>