2012年1月27日

JAWS-UG北陸第2回勉強会資料(JAWS-UG北陸 #2 AWS Identity and Access Management)

1月20日に開催されたJapan AWS User Group (JAWS-UG) Hokuriku(金沢)勉強会 第2回で、
cloudpackの磯辺(@muramasa64)が登壇しました。

発表の内容は、AWS Identity and Access Management(IAM)の用途やできなこと、
利用方法等について紹介しています。
さらに、AWS Multi-Factor Authentication(MFA)についても説明しており、
通常のAWSアカウントとパスワード以外に、利用者が物理的に所有している認証デバイスから
6桁のワンタイムパスワードを使って認証する方法を紹介しています。



使用したドキュメントは、JAWS-UG北陸 #2 AWS Identity and Access Managementよりご確認ください。

JAWS-UG【熊本/大阪】でなかのひとが発表します

JAWS-UG下記の日程にて、cloudpackなかのひとが
第1回「Jaws-UG-Kumamoto」セミナー
(Amazonクラウドセミナー)
Japan AWS User Group
(JAWS-UG) - Osaka勉強会 第5回
で発表します。



2月10日の第1回「Jaws-UG-Kumamoto」セミナー(Amazonクラウドセミナー)では、
cloudpackエバンジェリストの後藤(@kaz_goto)が「VPCについて(仮)」のタイトルで発表します。

また、2月18日のJapan AWS User Group (JAWS-UG) - Osaka勉強会 第5回では、
cloudpackエバンジェリストの後藤(@kaz_goto)が熊本で話す内容とは異なるかもしれませんが、
「VPCについて(仮)」とCTOの鈴木(@suz_lab)が「クラウドデザインパターン」のタイトルで発表します。


○開催概要
日時 イベント概要
2月10日(金) イベント名:第1回「Jaws-UG-Kumamoto」セミナー(Amazonクラウドセミナー)
会場:熊本県熊本市二の丸1-14 桜の馬場 城彩苑 (多目的交流施設)
発表者:@kaz_goto「VPCについて」
2月18日(土) イベント名:Japan AWS User Group (JAWS-UG) - Osaka勉強会 第5回
会場:大阪市中央区大手前1-2-15 テレビ大阪 西館1F
発表者:
@kaz_goto「VPCについて」
@suz_lab「クラウドデザインパターン」

詳細は、なかのひと発表スケジュールよりご確認ください。

MySQL JDBCをインストール

JavaのプログラムからMySQLに接続するには、JDBCのドライバをインストールする必要があります。
今回は、MySQL JDBCのインストール方法を紹介します。
(/usr/javaが設定済みとします。)

JDBCはMySQLの公式サイトからダウンロード可能です。

ダウンロード後、ファイルを解凍すると、下記のファイルがあります。
mysql-connector-java-x.x.xx-bin.jar
上記を下記のディレクトリにコピーします。
/usr/java
再度にCLASSPATHの設定を行います。

.bash_profileに追加をします。
CLASSPATH=$CLASSPATH:/usr/java/mysql-connector-java-x.x.xx-bin.jar export CLASSPATH
追加後、下記のコマンドで反映させます。
source .bash_profile
以上でJavaからMySQLに接続できます


こちらの記事はなかの人(be_hase)監修のもと掲載しています。
元記事は、こちら

2012年1月26日

DynamoDBってなんじゃ?(SDK編)

前回は、DynamoDBってなんじゃ?(AWSコンソール編)にて、テーブルの作成まで行いました。
今回は、それらのテーブルにSDKを利用してアクセスしてみます。
ここでは、PHP SDKを使用します。


○クラスの初期化

DynamoDBクラスの初期化は以下のように行います。
また、キー等のパラメータは認証用のファイルに記載しておき、省略することも可能です。
$ddb = new AmazonDynamoDB(
  array(
   'key' => 'xxxxxxxxxxxxxxx',
   'secret' => 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
   'default_cache_config' => '/tmp/cache'));

○データの投入

前回作成した2つのテーブルにそれぞれデータを投入します。
値の指定は、DynamoDBの型名とstring値を紐付けた形で投入します。
//book
$books = array(
array('1', '978-4274066306', 'Joel on Software'),
array('2', '978-0321413093', 'Implementation Patterns'),
array('3', '978-1244865723', 'Agile Software Development'),
);
for($i=0; $iput_item(array(
    'TableName' => 'book',
    'Item' => array(
      'id'   => array(AmazonDynamoDB::TYPE_NUMBER => (string)$books[$i][0]),
      'isbn' => array(AmazonDynamoDB::TYPE_STRING => (string)$books[$i][1]),
      'name' => array(AmazonDynamoDB::TYPE_STRING => (string)$books[$i][2]),
     )
  ));
}

//comment
$comments = array(
  array('1', strtotime('-10 days'), 'memorycraft', 'i like this'),
  array('1', strtotime('-7 days'), 'hoge', 'i never like this'),
  array('2', strtotime('-9 days'), 'moge', 'this is awesome'),
);
for($i=0; $iput_item(array(
    'TableName' => 'comment',
    'Item' => array(
      'book_id'    => array(AmazonDynamoDB::TYPE_NUMBER => (string)$comments[$i][0]),
      'posted_at'  => array(AmazonDynamoDB::TYPE_NUMBER => (string)$comments[$i][1]),
      'username'   => array(AmazonDynamoDB::TYPE_STRING => (string)$comments[$i][2]),
      'message'    => array(AmazonDynamoDB::TYPE_STRING => (string)$comments[$i][3]),
    )
  ));
}

○データアクセス

先程、データを投入したテーブルに対して、値の取得を行ないます。
Hashのプライマリキーで一意に取得できる場合は、下記のようにget_itemで行います。
//Hashプライマリキーで完全一致
echo 'get_item (1) ' .
print_r(
  $ddb->get_item(
    array(
      'TableName' => 'book',
      'Key' => array('HashKeyElement' => array(AmazonDynamoDB::TYPE_NUMBER => '1')
    )
  )->body->Item->to_json(),
  true
) . "\n";
出力は以下のようになります。
get_item (1) {"id":{"N":"1"},"isbn":{"S":"978-4274066306"},"name":{"S":"Joel on Software"}}

複合プライマリキーを使い、Hashキーを指定し、Rangeキーで絞るような場合は、queryを使用します。
//複合キーで検索
echo 'query ' .
print_r(
  $ddb->query(
    array('TableName' => 'comment',
      'HashKeyValue' => array(AmazonDynamoDB::TYPE_NUMBER => '1'),
      'ConsistentRead' => true,
      'RangeKeyCondition' => array(
        'ComparisonOperator' => AmazonDynamoDB::CONDITION_GREATER_THAN_OR_EQUAL,
        'AttributeValueList' => array(array(AmazonDynamoDB::TYPE_NUMBER => (string)strtotime('-8 days')))
      )
    )
  )->body->Items->to_json(),
  true
) . "\n";
出力は以下のようになります。
query {"0":{"book_id":{"N":"1"},"message":{"S":"i never like this"},"posted_at":{"N":"1326880572"},"username":{"S":"hoge"}}}
また、キー値以外で検索を行う場合は、scan関数を利用します。
//キー以外で検索
echo 'scan ' .
print_r(
  $ddb->scan(
    array(
      'TableName' => 'comment',
      'AttributeToGet' => array('username', 'message'),
      'ScanFilter' => array(
        'username' => array(
          'ComparisonOperator' => AmazonDynamoDB::CONDITION_EQUAL,
          'AttributeValueList' => array(
            array(AmazonDynamoDB::TYPE_STRING => 'memorycraft')
          )
        )
      )
    )
  )->body->Items->to_json(),
  true
) . "\n";
出力は以下のようになります。
scan {"0":{"book_id":{"N":"1"},"message":{"S":"i like this"},"posted_at":{"N":"1326621372"},"username":{"S":"memorycraft"}}}

○テーブルの作成

テーブルの作成は以下のように行います。
//book
$ddb->create_table(array(
        'TableName' => 'book',
        'KeySchema' => array(
                'HashKeyElement' => array(
                        'AttributeName' => 'id',
                        'AttributeType' => AmazonDynamoDB::TYPE_NUMBER
                )
        ),
        'ProvisionedThroughput' => array(
                'ReadCapacityUnits' => 50,
                'WriteCapacityUnits' => 10
        )
));

//comment
$ddb->create_table(array(
        'TableName' => 'comment',
        'KeySchema' => array(
                'HashKeyElement' => array(
                        'AttributeName' => 'book_id',
                        'AttributeType' => AmazonDynamoDB::TYPE_NUMBER
                ),
                'RangeKeyElement' => array(
                        'AttributeName' => 'posted_at',
                        'AttributeType' => AmazonDynamoDB::TYPE_NUMBER
                )
        ),
        'ProvisionedThroughput' => array(
                'ReadCapacityUnits' => 50,
                'WriteCapacityUnits' => 10
        )
));
この際、テーブルの作成には時間が多少かかるので、テーブルを作成した後に続けて
データ追加処理等を行う場合は、以下のように待機します。
foreach(array('book', 'comment') as $table_name){
  $count = 0;
  echo $table_name . " : status ";
  do {
    sleep(1);
    $count++;
    $res = $ddb->describe_table(array(
      'TableName' => $table_name
    ));
    $status = (string)$res->body->Table->TableStatus;
    echo ($status === 'ACTIVE' ? $status . "\n" : '.');
  }
  while ((string) $res->body->Table->TableStatus !== 'ACTIVE');
}
出力は以下のようになります。
book : status ...........................ACTIVE
comment : status ACTIVE

○テーブルの削除

テーブルの削除は以下のように行います。
foreach(array('book', 'comment') as $table_name){
        $ddb->delete_table(
                array('TableName' => $table_name)
        );
}

DynamoDBは、RDBとは違うので、データの構成等に工夫が必要ですが、RDBとの使い分けで非常に高い効果を
発揮すると思います。
尚、東京リージョンへの展開が待ち遠しいですが、US-Eastに立てたインスタンスからはRTTがないので、
ハイパフォーマンスを体験できます。


こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

DynamoDBってなんじゃ?(AWSコンソール編)

AWSがDynamoDBというサービスをリリースしました。
(リリースペースがとても早いです)
DynamoDBは高可用で超柔軟なスケーラビリティを実現したNoSQLサービスです。
SimpleDBもありますが、DynamoDBは更に柔軟でスケーラブルになっています。

DyanmoDBはSimpleDBと比べて以下のような利点があります。

  • SimpleDBでは、1つのドメイン(DBでいうテーブル)につき10GBというデータ量制限がありましたが、
    DynamoDBでは無制限で、ドメイン制限を超えた場合のスケーリングがアプリケーションレイヤーの
    設計にまで影響していたのが解消され、カスタマイズされたConsistentHashing法により自動的に
    スケーリングが行われます。
  • DynamoDBではスループットを設定できるため、アクセス数が増加しても低レイテンシが保証されます。
  • SimpleDBではマシン時間での課金でしたが、DynamoDBではスループットによる課金です。
    ユーザーはより費用の見積もりがしやすくなりました。
  • SimpleDBではすべてのアトリビュート(カラム)にインデックスが貼られていました。
    DynamoDBではシングルプライマリキーもしくはコンポジットプライマリキーにのみインデックスを
    貼ることで高パフォーマンスを図っています。


それでは、早速試してみます。

AWSコンソールを見ると、右端にDynamoDBのタブがあります。



これをクリックするとDynamoDBのダッシュボードが表示されるので、
「Create Table」をクリックして、テーブルの設定を行います。



はじめに、テーブル名とプライマリキーを設定します。
プライマリキーは単一のHashキーかHashとRangeの複合キーが設定できるので、
ここではbookというテーブル名でシングルHashキーを設定して「Continue」をクリックします。



次に必要なスループットを設定します。
Read CapacityとWrite Capacityの値を設定するのですが、それぞれ1秒に読み書きされる回数の見積もりと
1アイテム(DBでいうところの行)の平均データサイズで決まります。
下記の計算式で設定します。

Read Capacity:1秒間に読み込みされる回数 × 1つのアイテムの平均サイズ
Write Capacity:1秒間に書き込みされる回数 × 1つのアイテムの平均サイズ



また、「Help me calculate ...」というチェックを入れると、読み込み回数やデータの平均サイズ等を
入力して求めることもできます。



「Continue」をクリックしますと、Alarmの設定画面に移ります。
ここでは、上記で設定したスループットの何割を超えたら通知するかを設定できます。
設定したスループット以上の性能は出ないので、これで性能を監視し、
必要に応じてスループットをアップするような運用になります。



適宜設定して「Create Table」をクリックするとテーブルが作成されます。



以上で、テーブルの作成が終わりました。
作成されたテーブルが一覧画面に表示され、行を選択すると、プロパティ情報や
現在のスループットやレイテンシ等が表示されます。
また、CloudWatchのメトリクスやアラームの情報等も確認できます。



追加で、book_idとposted_atを複合ハッシュキーにもつcommentというテーブルも作成します。



まずは、テーブルの作成までできましたので、
次回はSDKからDynamoDBにアクセスしてみます。


こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら