47
AWSクラウドデザインパターンの実装ノウハウ アイレット株式会社 鈴木宏康 アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Embed Size (px)

Citation preview

Page 1: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

AWS Cloud Design Pattern (CDP)

AWSクラウドを使ったシステムアーキテクチャ設計を

行う際に発生する典型的な問題とそれに対する解決策設計方法を分かりやすく分類してノウハウとして利用できるように整理したものである

AWS Cloud Design Pattern (CDP) httpbitlycdp_all

新しいCDP(候補)

bull IP Pooling

bull Sorry Page

bull Permanent Redirect

bull Latency-based Routing

bull Latency Based Origin

bull Log Aggregation

bull Self Registration

bull Fanout

bull Cross-Region Replication

bull High Availability NAT

bull Routing-Based HA

bull RDP Proxy

bull OnDemand Bastion

bull OnDemand Firewall

httpawsclouddesignpatternorg

本セッションの狙い

AWSを操作するためのSDKやツールに焦点をあてCDPの中から幾つかのパターンをサンプルに実装コードやツールの利用方法について説明します

ndash パターン適用の自動化

ndash APIを使った自動化スクリプトの実装ノウハウ

ndash 再利用性のあるスクリプト作成

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 2: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

AWS Cloud Design Pattern (CDP)

AWSクラウドを使ったシステムアーキテクチャ設計を

行う際に発生する典型的な問題とそれに対する解決策設計方法を分かりやすく分類してノウハウとして利用できるように整理したものである

AWS Cloud Design Pattern (CDP) httpbitlycdp_all

新しいCDP(候補)

bull IP Pooling

bull Sorry Page

bull Permanent Redirect

bull Latency-based Routing

bull Latency Based Origin

bull Log Aggregation

bull Self Registration

bull Fanout

bull Cross-Region Replication

bull High Availability NAT

bull Routing-Based HA

bull RDP Proxy

bull OnDemand Bastion

bull OnDemand Firewall

httpawsclouddesignpatternorg

本セッションの狙い

AWSを操作するためのSDKやツールに焦点をあてCDPの中から幾つかのパターンをサンプルに実装コードやツールの利用方法について説明します

ndash パターン適用の自動化

ndash APIを使った自動化スクリプトの実装ノウハウ

ndash 再利用性のあるスクリプト作成

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 3: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

AWS Cloud Design Pattern (CDP) httpbitlycdp_all

新しいCDP(候補)

bull IP Pooling

bull Sorry Page

bull Permanent Redirect

bull Latency-based Routing

bull Latency Based Origin

bull Log Aggregation

bull Self Registration

bull Fanout

bull Cross-Region Replication

bull High Availability NAT

bull Routing-Based HA

bull RDP Proxy

bull OnDemand Bastion

bull OnDemand Firewall

httpawsclouddesignpatternorg

本セッションの狙い

AWSを操作するためのSDKやツールに焦点をあてCDPの中から幾つかのパターンをサンプルに実装コードやツールの利用方法について説明します

ndash パターン適用の自動化

ndash APIを使った自動化スクリプトの実装ノウハウ

ndash 再利用性のあるスクリプト作成

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 4: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

新しいCDP(候補)

bull IP Pooling

bull Sorry Page

bull Permanent Redirect

bull Latency-based Routing

bull Latency Based Origin

bull Log Aggregation

bull Self Registration

bull Fanout

bull Cross-Region Replication

bull High Availability NAT

bull Routing-Based HA

bull RDP Proxy

bull OnDemand Bastion

bull OnDemand Firewall

httpawsclouddesignpatternorg

本セッションの狙い

AWSを操作するためのSDKやツールに焦点をあてCDPの中から幾つかのパターンをサンプルに実装コードやツールの利用方法について説明します

ndash パターン適用の自動化

ndash APIを使った自動化スクリプトの実装ノウハウ

ndash 再利用性のあるスクリプト作成

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 5: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

本セッションの狙い

AWSを操作するためのSDKやツールに焦点をあてCDPの中から幾つかのパターンをサンプルに実装コードやツールの利用方法について説明します

ndash パターン適用の自動化

ndash APIを使った自動化スクリプトの実装ノウハウ

ndash 再利用性のあるスクリプト作成

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 6: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 7: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

7

APIの利用イメージ

AWS Cloud

ec2-run-instances ami-b232d0db

--instance-count 3

--availability-zone

ap-northeast-1a --instance-type m1small

httpdocsawsamazonco

mgenerallatestgrrandeht

ml

API endpoint

API

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 8: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

CDP実装ノウハウ

- APIツール編 -

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 9: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

システム構築時の皆様の関心事

バックアップ セキュリティ 可用性(HA)

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 10: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

バックアップのパターン

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 11: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Snapshot Pattern

データのバックアップを安全に耐久性高くとっておきたい

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 12: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

EBSからスナップショット(AMI)作成

Webコンソールからワンクリックで作れるけど

手作業は面倒くさい

rarrAPIを使おう

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 13: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

AWSのAPI

bull AWSサービスごとにREST形式のAPIを提供

bull コマンドラインSDKIDE

Java Python PHP NET Ruby nodeJS

iOS Android AWS Toolkit for Visual

Studio

AWS Toolkit for

Eclipse

Tools for Windows

PowerShell

Command Line Tools CLI (CL Interfaces)

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 14: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

実装とデモ① API経由のスナップショットAMIの作成

bull InstanceのIDを指定してスナップショットを作成する

bull 実装方法

ndash AWS CLI (Command Line Interface)を使ったスナップショット作成

aws ec2 create-image --instance-id i-89ea2589 ndashname backupXXXXXX

ndash APIを実行するときには認証情報が必要

bull アクセスキー

bull シークレットアクセスキー

認証

情報

APIコール

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 15: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 16: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

http169254169254latest

meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 17: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

API呼び出しに必要な情報の取得

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ)をみる

API

認証

情報

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 18: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

IAM Role

ロール名backup-user

権限スナップショットのみ

SDK実行時に認証情報を 自動的に取得

http169254169254latest

iamsecurity-credentialsbackup-user

起動時に設定

EC2

インスタンス

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 19: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

実装とデモ②

EC2インスタンスが自分自身のAMIを作成する

実装

bull AWS CLIを用いてメタデータを読み込む

bull EC2のメタデータからインスタンスIDを特定 INSTANCE_ID=`curl -s http169254169254latestmeta-datainstance-id`

bull AWS CLIは自動的に IAM Roleの認証情報を取得

bull インスタンスIDを使ってAPI実行しAMIを作成 aws ec2 create-image --instance-id $INSTANCE_ID --name backup$(date +YmdHM)

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 20: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

CloudDI Pattern

単一のスクリプトでインスタンスを自動的にセットアップしたい

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 21: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

EC2のタグを用いれば簡単にCloudDIが実現できる

カスタムのタグを作って(Backup-Generation)

各インスタンスに外部から値を与える

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 22: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

実装とデモ③

EC2インスタンスがメタデータを用いて自分自身のタグを見て AMIを取得する

実装方法

bull Ruby SDKを用いてメタデータを読み込む

bull そのメタデータからインスタンスIDを特定

bull インスタンスIDを用いてタグ情報を取得しバックアップ世代数を知る aws ec2 describe-tags | jq

bull インスタンスIDとタグ情報を使ってAPI実行しAMIを作成

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 23: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

http169254169254latest

user-data meta-data

ami-id ami-launch-index ami-manifest-path block-device-mapping hostname instance-action instance-id instance-type local-hostname local-ipv4 iam

dynamic

instance-identity

document

instanceId i-dc64c5de

billingProducts [ bp-6ba54002 ]

version 2010-08-31

imageId ami-b9d45bb8

accountId 557609899565

instanceType m1medium

kernelId null

ramdiskId null

architecture x86_64

pendingTime 2013-05-06T145420Z

availabilityZone ap-northeast-1a

devpayProductCodes null

privateIp 10200200100

region ap-northeast-1

mac metrics network placement profile public-ipv4 public-keys reservation-id security-groups

「EC2のメタデータ」

security-credentialsIAMロール名

AccessKeyId SecretAccessKey Token

インスタンス内からアクセス

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 24: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

リフレクションを用いたスクリプト作成

bull インスタンスID

bull 認証情報

bull リージョン

bull アベイラビリティゾーン

bull AMI ID

bull インスタンスタイプ

bull Public IP Private IP

bull VPCネットワークID

bull サブネット

EC2 ①自らに紐づく 情報(メタデータ) をみる

API

②APIを叩いてとる

認証

情報

バックアップ世代

IPアドレス

DBの接続情報

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 25: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

セキュリティのパターン

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 26: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Operational Firewall Pattern

規模が大きいシステムの場合担当するメンバーが多岐に渡るため担当範囲ごとにアクセス制御したい

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 27: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Ondemand Bastion Ondemand Firewall Pattern

セキュアなシステムでは不正侵入や不正利用を防ぐために極力接続口や接続時間を絞りたい

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 28: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

セキュリティのパターンの特徴

bull アクセス先アクセス元を最小限に絞る

bull 必要な時以外は外部からのアクセスを遮断する

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 29: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

実装とデモ

bull 利用するテクノロジー

ndash AWS SDK ( for Java )

ndash API (Amazon EC2)

bull 構成

ndash 利用申請

ndash 承認後サーバ起動

ndash 有効期限を設定

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 30: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

EC2クライアント AmazonEC2 ec2 = new AmazonEC2Client(credential) リージョン設定 ec2setRegion(RegiongetRegion(RegionsAP_NORTHEAST_1)) タグ設定(インスタンスの有効期限) CreateTagsRequest createTagsRequest = new CreateTagsRequest() Tag tag = new Tag(expire-time StringvalueOf(expireTime)) createTagsRequestwithTags(tag)withResources(instanceId) ec2createTags(createTagsRequest) SecurityGroupの設定を変更(必要に応じて) Bastionインスタンスの開始 StartInstancesRequest startInstanceRequest = new StartInstancesRequest() startInstanceRequestsetInstanceIds(ArraysasList(instanceId)) ec2startInstances(startInstanceRequest)

Bastionサーバの起動

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 31: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Expire設定 メタデータ取得( http169254169254latestmeta-datainstance-idにアクセス) String instanceId = EC2MetaDataUtilsgetInstanceId() AmazonEC2 ec2 = new AmazonEC2Client() インスタンスIDを使って対象のインスタンス情報をAPIで取得 Instance instance = describeInstance(ec2 instanceId) インスタンスのタグから有効期限を取得 int expireTime = getExpireTimeFromTag(instancegetTags()) 有効期限を減算 int newExpireTime = expireTime ndash 5 60 期限切れの場合は停止 if (newExpireTime lt= 0) ec2stopInstances(new StopInstancesRequest()withInstanceIds(instanceId)) else 期限内の場合はタグを更新 Tag newExpireTimeTag = new Tag(ldquoexpire-timerdquoStringvalueOf(newExpireTime)) ec2createTags( new CreateTagsRequest()withResources(instanceId)withTags(newExpireTimeTag))

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 32: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

可用性(HA)のパターン

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 33: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

HAを実装するパターン群

Internal

DNS

bull APIにてIPを移動

ndash EIP ENI Secondary IPを利用

bull 切り替えが早い

bull VPC内では同一AZのみ利用可能

Routing

Based

HA

Floating

IP

bull 内部DNSRoute53 で実現

ndash RDS(Multi-AZ)

bull IPアドレスに縛られない柔軟な切り替えが可能

bull 切り替えのスピードはTTLに依存

bull APIにてルーティングを変更

bull IPアドレスを変更せずにAZ越しの切り替えが可能

bull 構成が複雑になってしまう

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 34: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

デモ(構成例とフェイルオーバーの挙動)

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 35: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

初期構成

bull クライアント

ndash 仮想IPアドレス(1921682544)を宛先に

bull HA化するインスタンス

ndash ネットワークインターフェースに仮想IPアドレスを指定

ndash SourceDest Check を無効

ndash HA化インスタンスを相互監視

Corosync amp Pacemaker

(heartbeat)

bull Subnet amp Routing Table

ndash 仮想IPアドレス(1921682544)へのルーティングをHA化インスタンスに

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 36: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

HA化するインスタンスの設定

bull 仮想IPアドレス

ndash ループバックインターフェースに仮想IP

を付与

bull ループバックインタフェースの設定

【etcsysconfignetwork-scriptsifcfg-lo0】

DEVICE=lo0

IPADDR=1921682544

NETMASK=255255255255

NETWORK=1921682544

ONBOOT=yes

bull SourceDest Check

ndash 自分宛(Private IP)の通信のみを受け入れるか(デフォルトYes)

ndash Noにして自分以外の宛先(1921682544)も受け入れるようにする

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 37: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Corosync 【etccorosynccorosyncconf】

totem

version 2

secauth off

transport udpu

interface

ringnumber 0

transport udpu

bindnetaddr 10004

mcastport 5405

ttl 1

member memberaddr 10004

member memberaddr 10014

bull ノードの相互監視

ndash 両ノードにインストール

bull ユニキャスト(udpu)で相互通信

ndash マルチキャストブロードキャストが利用できないため

自分のIPアドレスを指定

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 38: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Pacemaker

bull リソース制御(障害時の切り替え)

【実行コマンド(片方のノードで実行)】 pcs property set no-quorum-policy=ignore

pcs property set stonith-enabled=false

pcs resource rsc defaults resource-stickiness=INFINITY migration-threshold=1

pcs resource create failover-routing lsbfailover-routing

アクティブノード障害時にスタンバイノードにてフェイルオーバースクリプトを実行

bull lsbfailover-routing ndash フェイルオーバー時に実行するスクリプト(etcinitdfailover-routing)

フェイルオーバースクリプトを実行

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 39: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Corosync amp Pacemaker の状態 (フェイルオーバー前)

ルーティングは10004のEC2インスタンスに

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 40: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

フェイルオーバー

bull Corosync amp Pacemaker

ndash 障害発生時にフェイルオーバースクリプトを実行

bull Python版CLI

ndash フェイルオーバースクリプトはPython版CLIで実装

ndash メタデータサービスで自分の情報を取得

ndash IAM Roleで認証

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 41: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Python版CLI

【EC2インスタンスをタイプごとに集計】

aws ec2 describe-instances gt | jq

gt [ Reservations[] | Instances[] | InstanceType ] |

group_by(InstanceType) | [] | [0] + Count

length

Count 55 InstanceType c1xlarge

Count 11 InstanceType m1large

Count 1 InstanceType m1medium

Count 1 InstanceType m1small

Count 8 InstanceType m1xlarge

Count 1 InstanceType t1micro

bull Pythonで実装されたAWSコマンドラインインターフェース

bull デフォルト出力はJSON形式

ndash jqで整形可能

bull IAMロールに対応

ndash メタデータから自動的にキーを取得

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 42: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

フェイルオーバースクリプト

【etcinitdassociate-route】

AZの取得

AZ=`curl -s http169254169254latestmeta-

dataplacementavailability-zone`

AZからリージョンを取得(文字列の調整)

REGION=`echo $AZ | cut -c 1-$(($AZ - 1))`

インスタンスIDの取得

INSTANCE_ID=`curl -s

http169254169254latestmeta-

datainstance-id`

ルーティングテーブルの変更

aws --region $REGION ec2 replace-route

--destination-cidr-block $DESTINATION_CIDR

--route-table-id $ROUTE_TABLE_ID

--instance-id $INSTANCE_ID

| logger -s -i -t $prog

【etcsysconfigfailover-routing】

変更対象のルーティングテーブル

ROUTE_TABLE_ID=rtb-yyyyyyy

ルーティングを変更するCIDR(仮想IP)

DESTINATION_CIDR=192168254432

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 43: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Corosync amp Pacemaker の状態 (フェイルオーバー後)

10014のrdquofailover-routingrdquoが実行される

10004がオフラインになり

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 44: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

CLUSTERPRO(NEC) using Routing Based HA Pattern

bull NEC社が開発するHAクラスタリングソフトウェア

bull AZ間のフェイルオーバーの仕組みにRouting Based HA Patternを利用

httpwwwneccojppfsoftclusterproclpdocmaterialX31_PP_AWS_JP_01pdf

P 16

フェールオーバ時に 仮想 IP アドレス制御 コマンド で

仮想 IP アドレスへのルーティングをStandby側のインスタンス(図では100220) に切り替えますその他のルーティングは環境にあわせて設定して下さい

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 45: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

まとめ

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 46: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

bull パターン適用の自動化

rarrパターンをベースに自動化スクリプトを実装できる

ndash 自動化オンデマンド化でクラウドの利点がより高まる

bull スクリプトを作る時は再利用性を高く実装する

ndash インスタンスIDやバックアップ間隔など設定値を含まない

ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)

ndash タグやuserdataを使用して起動時に設定値をセットする

継続的な情報交換情報収集を

ndash httpawsclouddesignpatternorg

ndash httpswwwfacebookcomawscdp

本セッションでお伝えしたかったこと

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp

Page 47: Hundreds of Thousands of Customers in 190 Countriesd36cz9buwru1tt.cloudfront.net/jp/summit2013/documentation/aws... · Java Python PHP .NET Ruby nodeJS iOS ... for Visual Studio AWS

Thank You

AWSクラウドデザインパターンの実装ノウハウ

アイレット株式会社 鈴木宏康

アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄

Logo supportARCHETYP httpwwwarchetypjp