20120528 aws meister-reloaded-awssd-kforjava-public

Post on 05-Dec-2014

4.114 views 2 download

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!!