AWSマイスターシリーズ
~AWS SDK for Java &
   AWS Toolkit for Eclipse~




                2012年05月28日
                大谷 晋平( @shot6 )
                片山 暁雄( @c9katayama )
                ソリューションアーキテクト
Agenda
 AWS Toolkit for Eclipse
 AWS SDK オーバービュー
 AWS SDK for Java
 コードサンプル
 まとめ




               Copyright © 2011 Amazon Web Services
AWS Toolkit for Eclipse
AWS Toolkit for Eclipse

 EclipseにAWS操作のための機能を追加するプラグイン
 AWSを使用したアプリの開発/テストをバックアップ
インストール前提
Java 1.5以上
Eclipse IDE for Java EE Developers 3.6
  3.7推奨
AWS Elastic Beanstalk Deployment:
  Eclipse Web Tools Platform 2.0以上
Amazon SimpleDB Management
  Eclipse Data Tools Platform 1.7 以上



                                     Java EE Developer
                                       に入ってます
インストール方法

Plugin更新サイトからインストール
  http://aws.amazon.com/eclipse/

Eclipse MarketPlaceからインストール
機能

アカウント管理
AWS Explorer
  各種サービスの情報表示/操作
EC2 コンソール
  EC2のコントロールパネル
AWS Elastic Beanstalk
  デプロイ、デバッグ、環境構築
AWS SDK for Java integration
  Javaプロジェクト/Webプロジェクトウィザード
アカウント管理

Access Key IDとSecret Access keyを登録
複数のアカウント登録が可能
AWS Explorer
 各サービス情報の一覧
     Amazon SNS
     Amazon S3
     Amazon SQS
     Amazon SimpleDB
     Amazon EC2
     AWS Elastic Beanstalk
     Amazon CloudFront
     Amazon DynamoDB
     Amazon RDS
 ツリーから情報にアクセス
リージョンとアカウント

メニューからリージョンとアカウントの切り替え
AWS Explorer – Amazon SNS

 トピックの一覧表示
 トピックの作成
 サブスクリプションの作成/削除
AWS Explorer – Amazon S3

 Bucketの作成/削除、権限設定
 オブジェクトの一覧
   ツリー状に表示
 オブジェクトの削除、権限設定、Pre-signed URLの生成
 オブジェクトアップロード
   EclipseへのD&Dでアップロード
AWS Explorer – Amazon SQS

 キューの作成、削除
 キューへのメッセージ送信
 キュー内の一覧
 メッセージの削除
AWS Explorer – Amazon SimpleDB

 ドメインの作成/削除
 ドメイン内の一覧
 行の追加/削除
 SimpleDBクエリーエディタ
   コードアシストあり
AWS Explorer – Amazon CloudFront

 既存Distributionの一覧
 Distributionの内容表示
 Distributionの有効化/無効化
AWS Explorer – Amazon DynamoDB

 テーブルの追加/削除
 キャパシティの変更
 テーブル内アイテム一覧
 属性追加
 スキャンの実行
AWS Explorer – Amazon RDS

 既存RDSの一覧
 DBへの接続
   情報はData Managementに格納
    • パスワード変更などは
      Preferences>DataManagementから
 接続後は通常のJDBC接続で管理
EC2 コンソール
 AMI管理
  検索、削除、AMIからの起動
 インスタンス管理
  右クリックから状態変更、SSH接続、AMI作成、EBSの操作
  インスタンスタイプおよびセキュリティグループによるフィル
   ター
EC2コンソール

EBS管理
  EBS作成、削除、スナップショット作成
  スナップショット一覧、削除
EC2コンソール

セキュリティグループ管理
  セキュリティグループ作成、削除
  アクセス条件の追加、削除
AWS Elastic Beanstalk

 Elastic Benstalkの環境情報表示と編集
 各環境に属するAutoScaling,ELB,EC2の一覧表示
AWS Elastic Beanstalk

 各種詳細設定
   AutoScalingポリシー
    • トリガー条件、インスタンス起動設定、ゾーン設
      定
   JavaVM設定
   ELB設定
   通知設定
AWS SDK for Java integration

 プロジェクト構築時のウィザートを提供
 通常JavaプロジェクトとWebプロジェクトを構築し、クラス
 マスにAWS SDK for Javaを追加
   AWS SDKはeclipse updateを通じて最新版を取得可能
 サンプルコードとAWSアカウント設定が可能
   すぐに動作するサンプルがソース提供
まとめ

AWS Toolkit for Eclipseは開発者に焦点
  EC2、Beanstalkは機能が充実
  それ以外はサービス情報の確認に利用
AWS SDKを利用する場合に便利
  SDKバージョンの選択
  AWSアカウントが選択可能
  SDKにソースアタッチ済み
AWS Toolkit for Eclipseを使用するなら、コードでAWSク
ラウドをコントロールしよう!
機能が足りない場合は・・・

AWS Toolkit for JavaはOSS
  https://github.com/amazonwebservices/aws-toolkit-for-
   eclipse
  拡張はご自由に!
AWS SDK オーバービュー
AWSのサービス操作と言えば


       AWS Management Console




AWSコマンドラインツール
これらの裏側では・・・

各サービスの各操作に対して、APIが定義されている
AWSでは・・・
  人間がGUIまたはCUI越しに叩く
  プログラミングしてそれを自動化・簡易化・カスタマイズ
  • 人間が手でやらなくてはいけない事をプログラミ
    ングして自動化できる、これがSDKで実現可能
  • しかも簡単
  • AWSの実は最も優れた一面
AWS SDKとは

 AWSのサービスを操作できるSDK
  プログラムでクラウドを操作できるAPI群
  さまざまな言語で提供
   •   AWS SDK for Java
   •   AWS SDK for C#
   •   AWS SDK for Ruby
   •   AWS SDK for PHP
   •   AWS SDK for Android
   •   AWS SDK for iOS
   •   有志の方による実装(PythonやActionScript)も
  通信は原則HTTPS
  署名による暗号化
起動、停止



REST
       Put,Get
SOAP

         DB起動、バックアップ




        情報取得
操作の種類

例えばEC2
   インスタンス起動・・・RunInstances
   リブート・・・ RebootInstances
   IPアドレス付与・・AllocateAddress
   など100種類以上の操作が、プログラムから実行可能
AWS SDK for Java
AWS SDK for Java


 AWS SDK for Java
    Amazon提供のAWS開発用Java SDK
    http://aws.amazon.com/sdkforjava/
    環境:Java5以降
    最新版 1.3.10
    依存ライブラリ
      • Commons-codec,httpclient,logging
      • Jackson
      • Javamail
      • stax
操作可能サービス

EC2                    S3
Autoscaling            Cloudwatch
ElasticLoadBalancing   SimpleWorkflow
ElasticBeanstalk       IdentityManagement
ElasticMapReduce       ImportExport
RDS                    ElastiCache
Simpledb               SimpleDB
SNS                    SES
DynamoDB               SQS
StorageGateway         CloudSearch
はじめに取得するもの
 AWSの認証キー(アクセスキー、シークレットキ-)
 AWSログイン後、[アカウント]>[セキュリティ証明書]の画面
  から確認OK
Java SDKクライアントクラスの基本

 クレデンシャル情報を渡す
  アクセスキー
  シークレットキー
 方法としては
  BasicAWSCredentialsで直接渡す
  PropertiesCredentialsでプロパティファ
   イルに記述する
  独自でAWSCredentialsを拡張する
このような感じ


AWSCredentials credentials = null;
try {
   credentials = new PropertiesCredentials(Util.class
.getResourceAsStream("AwsCredentials.properties"));
} catch (IOException e) {
   //例外処理
}
//このクレデンシャルを使ってClientを生成する


 IAM利用時は、IAMユーザーのアクセスキー、シークレットキーを利用。
 IAMユーザーでアクセス権のないメソッドを呼ぶと、例外が発生。
EC2

    AmazonEC2Client
// EC2操作用のクライアント
AmazonEC2 ec2
          = new AmazonEC2Client(credentials);

// 立ち上げたいインスタンス情報の作成
RunInstancesRequest runInstancesRequest = new
RunInstancesRequest("ami-xxxxx", 5, 5)
  .withKeyName(“yourkeyname")
  .withSecurityGroupIds(“yoursecgroup")
  .withMonitoring(true)
  .withInstanceType(InstanceType.M1Small);

// インスタンスの起動
ec2.runInstances(runInstancesRequest);
S3

    AmazonS3Client

// S3操作用クライアント
AmazonS3 s3 = new AmazonS3Client(credentials);

// bucket作成
s3.createBucket(“mybucket");

//オブジェクトのPUT
PutObjectResult ret = client.putObject("mybucket",
"aaa.txt", file);
S3での巨大ファイルの簡易アップロード
//TransferManagerを作成
AmazonS3Client client = new AmazonS3Client(cred);
TransferManager manager =
   new TransferManager(client);

//最低1チャンクを5MBに設定
TransferManagerConfiguration c = new
TransferManagerConfiguration();
c.setMinimumUploadPartSize(5 * 1024L * 1024L);
manager.setConfiguration(configuration);

//巨大ファイルのアップロード実行と進捗の監視
Upload upload = manager.upload(bucketName,
bigfileName, target, o);
while (upload.isDone() == false) {…
RDS

   AmazonRDSClinet
// RDS操作用クライアント
AmazonRDS amazonRDS =
       new AmazonRDSClient(credentials);
// DB instance作成
CreateDBInstanceRequest createDBInstanceRequest
= new CreateDBInstanceRequest()
.withAllocatedStorage(5)
.withMultiAZ(true)
.withDBInstanceClass("db.m1.small")
…
.withEngine("MySQL");
DBInstance result =
rds.createDBInstance(createDBInstanceRequest);
Java SDKの構成

 各サービス毎にクライアントクラスが付属
  面倒な下記のようなことは利用者から隠ぺいしてくれる
    • HTTP通信及び例外ハンドリング
    • 署名
    • エラー時のリトライ処理
 サービスどれでもほぼ同一で直感的な使い勝手の提供
 極力、利用者は単純に呼び出すだけでよい
 プラガブルな構成で、部分的に入れ替えられる
  挙動を変えたい
  例外のハンドリング方法を変えたい
  処理速度を上げたい
Java SDKの構成イメージ

  <<abstract>>    保持
                            AmazonHttp
  AmazonWeb
                              Client
  ServiceClient

                                execute(
                                  リクエスト,
  AmazonEC2                       レスポンスハンドラー,
    Client                        エラーハンドラー,
                                  ExecutionContext)

                       保持                 ・利用する署名方法
                                          ・クレデンシャル
  AmazonEC2             ExecutionCo       ・リトライ
  AsyncClient              ntext
Java SDKのパッケージ構成

 com.amazonaws
    auth : 署名関連
    handlers : SDKの挙動をカスタマイズするハンドラー
    http : 実際のHTTPリクエストを処理する
    internal : リトライ関連
    sdk : バージョン情報
    services : 各サービス毎の実体
    transform : API経由で返ってくるXMLをパースする実体
    util : ユーティリティ
Java SDKの各サービス毎の構成

 クライアントは実体が2つ
  同期通信を中心としたクライアント : XxxClient
  非同期通信を追加した非同期クライアント : XxxAsyncClient
リージョンを選択する

リージョンの選択
デフォルトはどれもus-east
setEndpointメソッドで指定
  setEndpoint("ec2.ap-southeast-1.amazonaws.com")
サービス毎のエンドポイントは下記URL参照
  http://docs.amazonwebservices.com/general/latest/gr/r
   ande.html
有効な利用方法

利用方法(運用面)
 決まったインスタンスを起動するバッチ
 固定ディスク(EBS)のスナップショットを定期取得
 S3からデータを定期的に取得
 S3上のデータを監視して、無くなったら通知
利用方法(アプリから)
 アプリのバックエンドとして、DynamoDBを使う
 メール送信のためにSMSを使う
 データ保存のためにS3を使う
Tips等

 実行はどこからでも可能
  インターネットのエンドポイントへアクセス出来れば、EC2イ
   ンスタンスからでも、自分のPCからでもアクセス可能
  EC2からであれば、メタデータと組み合わせて自己構成できる
 便利なフレームワークがついている場合も
  DynamoDB ORマッパー
  S3 ハイレベルAPI
  SimpleWorkflow FlowFramework
setterとwith

     各種リクエストオブジェクトに対して値を設定する場合、
     setXXXとwithXXXが利用可能。
     withXXXの場合、戻り値がリクエストオブジェクトになるの
     で、fluentな形での実装が可能。
     複数追加できるようなパラメータ(add系)の場合、setterに
     はCollectionの引数しかない場合が多いが、withだと実際の
     型の引数が取れる。

//setter
 req.setBlockDeviceMappings(Arrays.asList(new BlockDeviceMapping()));
//with
req.
  withBlockDeviceMappings(new BlockDeviceMapping()).
  withBlockDeviceMappings(new BlockDeviceMapping());
アドバンスドなトピック

Java SDKは拡張性をかなり確保した状態になっている
Client/AsyncClient自体も自分で拡張できる
  おおざっぱなやり方はインターフェースをそのまま継承
細かく拡張ポイントを入れ替えることも可能
    ClientConfiguration
    RequestHandler
    CustomBackoffStrategy
    Marshaller/UnMarshaller
ClientConfiguration
 各Clientクラスの基本的な挙動を決定する設定
     ソケットのタイムアウト値
     最大コネクション数
     最大リトライ数
     使用するプロトコル(デフォルトHTTPS)
     プロキシ関連設定
     コネクションタイムアウト
 各Client生成時にClientConfigurationを渡す
RequestHandler
 ServletでいうところのいわゆるFilter
     デバッグ時や、何か統一的に処理させたい場合など便利
     beforeRequest : リクエスト送信前
     afterResponse : レスポンス受信後
     afterError : エラー受信後
 各サービスごとに定義可能
   Clientで普通に渡す
   com/amazonaws/services/xxx/request.handlersというファ
    イルをおいて、これに定義するとロードされる
 標準で既に定義されているものも
   EC2RequestHandler
   QueueUrlHandler
   Route53IdRequestHandler
CustomBackoffStrategy
     AWSクラウド側へのリトライ間隔をコントロールする
       カスタマイズして現状使っているのはDynamoDBのみ
       実行コンテキストであるExecutionContextに設定して渡す
     AmazonHttpClientの600行目付近
       pauseExponentiallyメソッド

 private void pauseExponentially(int retries, AmazonServiceException
previousException, CustomBackoffStrategy backoffStrategy) {
     long delay = 0;
     if (backoffStrategy != null) {
         delay = backoffStrategy.getBackoffPeriod(retries);
     } else {
         long scaleFactor = 300;
         …
         delay = (long) (Math.pow(2, retries) * scaleFactor);
     }
     …
}
Marshaller/Unmarshaller
 AWSが提供しているXMLパース(一部JSONパース)では遅い
 ので色々いらないものを省略してパースしたい
   Java SDKではStAXというプルモデル型のパーサー
    • XMLのどこを読むかをコントロールしやすい
   Clientを書いて、自分でMarshaller/Unmarshallerする
 各サービス.model.transformの下
   ここにMarshaller/Unmarshallerが大量にいる
 コーディングポリシー的には
   Clientの各メソッド内でMarshallしてRequest<X>を作成
   UnmarshallerはResponseHandlerにセットされて、
    AmazonHttpClientに渡されてレスポンス帰ってきたら実行
Java SDKのまとめ
 JavaのSDKを使うことで
  運用管理での煩雑な手間をコーディングして落とすことが可能
   • もしかしてCloudFormationよりも楽?
  どのサービスでも同じような使い勝手で利用可能で楽
  実際のサービス開発のお供に
   • S3
   • SNS/SQS/SWF
   • DynamoDB
 AWSはコーディングする方の力を最大限に引き出すインフラ
  HAPPY CODING!!

20120528 aws meister-reloaded-awssd-kforjava-public

  • 1.
    AWSマイスターシリーズ ~AWS SDK forJava & AWS Toolkit for Eclipse~ 2012年05月28日 大谷 晋平( @shot6 ) 片山 暁雄( @c9katayama ) ソリューションアーキテクト
  • 2.
    Agenda AWS Toolkitfor Eclipse AWS SDK オーバービュー AWS SDK for Java コードサンプル まとめ Copyright © 2011 Amazon Web Services
  • 3.
  • 4.
    AWS Toolkit forEclipse EclipseにAWS操作のための機能を追加するプラグイン AWSを使用したアプリの開発/テストをバックアップ
  • 5.
    インストール前提 Java 1.5以上 Eclipse IDEfor Java EE Developers 3.6  3.7推奨 AWS Elastic Beanstalk Deployment:  Eclipse Web Tools Platform 2.0以上 Amazon SimpleDB Management  Eclipse Data Tools Platform 1.7 以上 Java EE Developer に入ってます
  • 6.
  • 7.
    機能 アカウント管理 AWS Explorer 各種サービスの情報表示/操作 EC2 コンソール  EC2のコントロールパネル AWS Elastic Beanstalk  デプロイ、デバッグ、環境構築 AWS SDK for Java integration  Javaプロジェクト/Webプロジェクトウィザード
  • 8.
    アカウント管理 Access Key IDとSecretAccess keyを登録 複数のアカウント登録が可能
  • 9.
    AWS Explorer 各サービス情報の一覧  Amazon SNS  Amazon S3  Amazon SQS  Amazon SimpleDB  Amazon EC2  AWS Elastic Beanstalk  Amazon CloudFront  Amazon DynamoDB  Amazon RDS ツリーから情報にアクセス
  • 10.
  • 11.
    AWS Explorer –Amazon SNS トピックの一覧表示 トピックの作成 サブスクリプションの作成/削除
  • 12.
    AWS Explorer –Amazon S3 Bucketの作成/削除、権限設定 オブジェクトの一覧  ツリー状に表示 オブジェクトの削除、権限設定、Pre-signed URLの生成 オブジェクトアップロード  EclipseへのD&Dでアップロード
  • 13.
    AWS Explorer –Amazon SQS キューの作成、削除 キューへのメッセージ送信 キュー内の一覧 メッセージの削除
  • 14.
    AWS Explorer –Amazon SimpleDB ドメインの作成/削除 ドメイン内の一覧 行の追加/削除 SimpleDBクエリーエディタ  コードアシストあり
  • 15.
    AWS Explorer –Amazon CloudFront 既存Distributionの一覧 Distributionの内容表示 Distributionの有効化/無効化
  • 16.
    AWS Explorer –Amazon DynamoDB テーブルの追加/削除 キャパシティの変更 テーブル内アイテム一覧 属性追加 スキャンの実行
  • 17.
    AWS Explorer –Amazon RDS 既存RDSの一覧 DBへの接続  情報はData Managementに格納 • パスワード変更などは Preferences>DataManagementから 接続後は通常のJDBC接続で管理
  • 18.
    EC2 コンソール AMI管理  検索、削除、AMIからの起動 インスタンス管理  右クリックから状態変更、SSH接続、AMI作成、EBSの操作  インスタンスタイプおよびセキュリティグループによるフィル ター
  • 19.
  • 20.
  • 21.
    AWS Elastic Beanstalk Elastic Benstalkの環境情報表示と編集 各環境に属するAutoScaling,ELB,EC2の一覧表示
  • 22.
    AWS Elastic Beanstalk 各種詳細設定  AutoScalingポリシー • トリガー条件、インスタンス起動設定、ゾーン設 定  JavaVM設定  ELB設定  通知設定
  • 23.
    AWS SDK forJava integration プロジェクト構築時のウィザートを提供 通常JavaプロジェクトとWebプロジェクトを構築し、クラス マスにAWS SDK for Javaを追加  AWS SDKはeclipse updateを通じて最新版を取得可能 サンプルコードとAWSアカウント設定が可能  すぐに動作するサンプルがソース提供
  • 24.
    まとめ AWS Toolkit forEclipseは開発者に焦点  EC2、Beanstalkは機能が充実  それ以外はサービス情報の確認に利用 AWS SDKを利用する場合に便利  SDKバージョンの選択  AWSアカウントが選択可能  SDKにソースアタッチ済み AWS Toolkit for Eclipseを使用するなら、コードでAWSク ラウドをコントロールしよう!
  • 25.
    機能が足りない場合は・・・ AWS Toolkit forJavaはOSS  https://github.com/amazonwebservices/aws-toolkit-for- eclipse  拡張はご自由に!
  • 26.
  • 27.
    AWSのサービス操作と言えば AWS Management Console AWSコマンドラインツール
  • 28.
    これらの裏側では・・・ 各サービスの各操作に対して、APIが定義されている AWSでは・・・  人間がGUIまたはCUI越しに叩く  プログラミングしてそれを自動化・簡易化・カスタマイズ • 人間が手でやらなくてはいけない事をプログラミ ングして自動化できる、これがSDKで実現可能 • しかも簡単 • AWSの実は最も優れた一面
  • 29.
    AWS SDKとは AWSのサービスを操作できるSDK  プログラムでクラウドを操作できるAPI群  さまざまな言語で提供 • AWS SDK for Java • AWS SDK for C# • AWS SDK for Ruby • AWS SDK for PHP • AWS SDK for Android • AWS SDK for iOS • 有志の方による実装(PythonやActionScript)も  通信は原則HTTPS  署名による暗号化
  • 30.
    起動、停止 REST Put,Get SOAP DB起動、バックアップ 情報取得
  • 31.
    操作の種類 例えばEC2  インスタンス起動・・・RunInstances  リブート・・・ RebootInstances  IPアドレス付与・・AllocateAddress  など100種類以上の操作が、プログラムから実行可能
  • 32.
  • 33.
    AWS SDK forJava AWS SDK for Java  Amazon提供のAWS開発用Java SDK  http://aws.amazon.com/sdkforjava/  環境:Java5以降  最新版 1.3.10  依存ライブラリ • Commons-codec,httpclient,logging • Jackson • Javamail • stax
  • 34.
    操作可能サービス EC2 S3 Autoscaling Cloudwatch ElasticLoadBalancing SimpleWorkflow ElasticBeanstalk IdentityManagement ElasticMapReduce ImportExport RDS ElastiCache Simpledb SimpleDB SNS SES DynamoDB SQS StorageGateway CloudSearch
  • 35.
  • 36.
    Java SDKクライアントクラスの基本 クレデンシャル情報を渡す  アクセスキー  シークレットキー 方法としては  BasicAWSCredentialsで直接渡す  PropertiesCredentialsでプロパティファ イルに記述する  独自でAWSCredentialsを拡張する
  • 37.
    このような感じ AWSCredentials credentials =null; try { credentials = new PropertiesCredentials(Util.class .getResourceAsStream("AwsCredentials.properties")); } catch (IOException e) { //例外処理 } //このクレデンシャルを使ってClientを生成する IAM利用時は、IAMユーザーのアクセスキー、シークレットキーを利用。 IAMユーザーでアクセス権のないメソッドを呼ぶと、例外が発生。
  • 38.
    EC2 AmazonEC2Client // EC2操作用のクライアント AmazonEC2 ec2 = new AmazonEC2Client(credentials); // 立ち上げたいインスタンス情報の作成 RunInstancesRequest runInstancesRequest = new RunInstancesRequest("ami-xxxxx", 5, 5) .withKeyName(“yourkeyname") .withSecurityGroupIds(“yoursecgroup") .withMonitoring(true) .withInstanceType(InstanceType.M1Small); // インスタンスの起動 ec2.runInstances(runInstancesRequest);
  • 39.
    S3 AmazonS3Client // S3操作用クライアント AmazonS3 s3 = new AmazonS3Client(credentials); // bucket作成 s3.createBucket(“mybucket"); //オブジェクトのPUT PutObjectResult ret = client.putObject("mybucket", "aaa.txt", file);
  • 40.
    S3での巨大ファイルの簡易アップロード //TransferManagerを作成 AmazonS3Client client =new AmazonS3Client(cred); TransferManager manager = new TransferManager(client); //最低1チャンクを5MBに設定 TransferManagerConfiguration c = new TransferManagerConfiguration(); c.setMinimumUploadPartSize(5 * 1024L * 1024L); manager.setConfiguration(configuration); //巨大ファイルのアップロード実行と進捗の監視 Upload upload = manager.upload(bucketName, bigfileName, target, o); while (upload.isDone() == false) {…
  • 41.
    RDS AmazonRDSClinet // RDS操作用クライアント AmazonRDS amazonRDS = new AmazonRDSClient(credentials); // DB instance作成 CreateDBInstanceRequest createDBInstanceRequest = new CreateDBInstanceRequest() .withAllocatedStorage(5) .withMultiAZ(true) .withDBInstanceClass("db.m1.small") … .withEngine("MySQL"); DBInstance result = rds.createDBInstance(createDBInstanceRequest);
  • 42.
    Java SDKの構成 各サービス毎にクライアントクラスが付属  面倒な下記のようなことは利用者から隠ぺいしてくれる • HTTP通信及び例外ハンドリング • 署名 • エラー時のリトライ処理 サービスどれでもほぼ同一で直感的な使い勝手の提供 極力、利用者は単純に呼び出すだけでよい プラガブルな構成で、部分的に入れ替えられる  挙動を変えたい  例外のハンドリング方法を変えたい  処理速度を上げたい
  • 43.
    Java SDKの構成イメージ <<abstract>> 保持 AmazonHttp AmazonWeb Client ServiceClient execute( リクエスト, AmazonEC2 レスポンスハンドラー, Client エラーハンドラー, ExecutionContext) 保持 ・利用する署名方法 ・クレデンシャル AmazonEC2 ExecutionCo ・リトライ AsyncClient ntext
  • 44.
    Java SDKのパッケージ構成 com.amazonaws  auth : 署名関連  handlers : SDKの挙動をカスタマイズするハンドラー  http : 実際のHTTPリクエストを処理する  internal : リトライ関連  sdk : バージョン情報  services : 各サービス毎の実体  transform : API経由で返ってくるXMLをパースする実体  util : ユーティリティ
  • 45.
    Java SDKの各サービス毎の構成 クライアントは実体が2つ  同期通信を中心としたクライアント : XxxClient  非同期通信を追加した非同期クライアント : XxxAsyncClient
  • 46.
  • 47.
    有効な利用方法 利用方法(運用面)  決まったインスタンスを起動するバッチ  固定ディスク(EBS)のスナップショットを定期取得 S3からデータを定期的に取得  S3上のデータを監視して、無くなったら通知 利用方法(アプリから)  アプリのバックエンドとして、DynamoDBを使う  メール送信のためにSMSを使う  データ保存のためにS3を使う
  • 48.
    Tips等 実行はどこからでも可能 インターネットのエンドポイントへアクセス出来れば、EC2イ ンスタンスからでも、自分のPCからでもアクセス可能  EC2からであれば、メタデータと組み合わせて自己構成できる 便利なフレームワークがついている場合も  DynamoDB ORマッパー  S3 ハイレベルAPI  SimpleWorkflow FlowFramework
  • 49.
    setterとwith 各種リクエストオブジェクトに対して値を設定する場合、 setXXXとwithXXXが利用可能。 withXXXの場合、戻り値がリクエストオブジェクトになるの で、fluentな形での実装が可能。 複数追加できるようなパラメータ(add系)の場合、setterに はCollectionの引数しかない場合が多いが、withだと実際の 型の引数が取れる。 //setter req.setBlockDeviceMappings(Arrays.asList(new BlockDeviceMapping())); //with req. withBlockDeviceMappings(new BlockDeviceMapping()). withBlockDeviceMappings(new BlockDeviceMapping());
  • 50.
    アドバンスドなトピック Java SDKは拡張性をかなり確保した状態になっている Client/AsyncClient自体も自分で拡張できる おおざっぱなやり方はインターフェースをそのまま継承 細かく拡張ポイントを入れ替えることも可能  ClientConfiguration  RequestHandler  CustomBackoffStrategy  Marshaller/UnMarshaller
  • 51.
    ClientConfiguration 各Clientクラスの基本的な挙動を決定する設定  ソケットのタイムアウト値  最大コネクション数  最大リトライ数  使用するプロトコル(デフォルトHTTPS)  プロキシ関連設定  コネクションタイムアウト 各Client生成時にClientConfigurationを渡す
  • 52.
    RequestHandler ServletでいうところのいわゆるFilter  デバッグ時や、何か統一的に処理させたい場合など便利  beforeRequest : リクエスト送信前  afterResponse : レスポンス受信後  afterError : エラー受信後 各サービスごとに定義可能  Clientで普通に渡す  com/amazonaws/services/xxx/request.handlersというファ イルをおいて、これに定義するとロードされる 標準で既に定義されているものも  EC2RequestHandler  QueueUrlHandler  Route53IdRequestHandler
  • 53.
    CustomBackoffStrategy AWSクラウド側へのリトライ間隔をコントロールする  カスタマイズして現状使っているのはDynamoDBのみ  実行コンテキストであるExecutionContextに設定して渡す AmazonHttpClientの600行目付近  pauseExponentiallyメソッド private void pauseExponentially(int retries, AmazonServiceException previousException, CustomBackoffStrategy backoffStrategy) { long delay = 0; if (backoffStrategy != null) { delay = backoffStrategy.getBackoffPeriod(retries); } else { long scaleFactor = 300; … delay = (long) (Math.pow(2, retries) * scaleFactor); } … }
  • 54.
    Marshaller/Unmarshaller AWSが提供しているXMLパース(一部JSONパース)では遅い ので色々いらないものを省略してパースしたい  Java SDKではStAXというプルモデル型のパーサー • XMLのどこを読むかをコントロールしやすい  Clientを書いて、自分でMarshaller/Unmarshallerする 各サービス.model.transformの下  ここにMarshaller/Unmarshallerが大量にいる コーディングポリシー的には  Clientの各メソッド内でMarshallしてRequest<X>を作成  UnmarshallerはResponseHandlerにセットされて、 AmazonHttpClientに渡されてレスポンス帰ってきたら実行
  • 55.
    Java SDKのまとめ JavaのSDKを使うことで  運用管理での煩雑な手間をコーディングして落とすことが可能 • もしかしてCloudFormationよりも楽?  どのサービスでも同じような使い勝手で利用可能で楽  実際のサービス開発のお供に • S3 • SNS/SQS/SWF • DynamoDB AWSはコーディングする方の力を最大限に引き出すインフラ  HAPPY CODING!!