20120528 aws meister-reloaded-awssd-kforjava-public
-
Upload
amazon-web-services-japan -
Category
Technology
-
view
4.114 -
download
2
description
Transcript of 20120528 aws meister-reloaded-awssd-kforjava-public
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 プログラムでクラウドを操作できる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 署名による暗号化
AWS SDKとは
起動、停止
Put,Get
DB起動、バックアップ
情報取得
REST
SOAP
操作の種類
例えば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
// S3操作用クライアント AmazonS3 s3 = new AmazonS3Client(credentials); // bucket作成 s3.createBucket(“mybucket"); //オブジェクトのPUT PutObjectResult ret = client.putObject("mybucket", "aaa.txt", file);
AmazonS3Client
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の構成イメージ
AmazonEC2Client
AmazonEC2AsyncClient
<<abstract>>AmazonWebServiceClient
AmazonHttpClient
保持
execute( リクエスト, レスポンスハンドラー, エラーハンドラー, ExecutionContext)
ExecutionContext
保持 ・利用する署名方法 ・クレデンシャル ・リトライ
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!!