Upload
trankien
View
220
Download
4
Embed Size (px)
Citation preview
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
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
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
新しい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
本セッションの狙い
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
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
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
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
システム構築時の皆様の関心事
バックアップ セキュリティ 可用性(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
バックアップのパターン
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
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
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
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
実装とデモ① 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
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
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
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
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
実装とデモ②
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
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
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
実装とデモ③
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
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
リフレクションを用いたスクリプト作成
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
セキュリティのパターン
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
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
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
セキュリティのパターンの特徴
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
実装とデモ
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
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
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
可用性(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
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
デモ(構成例とフェイルオーバーの挙動)
初期構成
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
初期構成
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
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
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
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
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
フェイルオーバー
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
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
フェイルオーバースクリプト
【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
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
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
まとめ
bull パターン適用の自動化
rarrパターンをベースに自動化スクリプトを実装できる
ndash 自動化オンデマンド化でクラウドの利点がより高まる
bull スクリプトを作る時は再利用性を高く実装する
ndash インスタンスIDやバックアップ間隔など設定値を含まない
ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)
ndash タグやuserdataを使用して起動時に設定値をセットする
継続的な情報交換情報収集を
ndash httpawsclouddesignpatternorg
ndash httpswwwfacebookcomawscdp
本セッションでお伝えしたかったこと
Thank You
AWSクラウドデザインパターンの実装ノウハウ
アイレット株式会社 鈴木宏康
アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄
Logo supportARCHETYP httpwwwarchetypjp
bull パターン適用の自動化
rarrパターンをベースに自動化スクリプトを実装できる
ndash 自動化オンデマンド化でクラウドの利点がより高まる
bull スクリプトを作る時は再利用性を高く実装する
ndash インスタンスIDやバックアップ間隔など設定値を含まない
ndash メタデータやタグdescribe系のAPIで設定値を取得する(リフレクション)
ndash タグやuserdataを使用して起動時に設定値をセットする
継続的な情報交換情報収集を
ndash httpawsclouddesignpatternorg
ndash httpswwwfacebookcomawscdp
本セッションでお伝えしたかったこと
Thank You
AWSクラウドデザインパターンの実装ノウハウ
アイレット株式会社 鈴木宏康
アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄
Logo supportARCHETYP httpwwwarchetypjp
Thank You
AWSクラウドデザインパターンの実装ノウハウ
アイレット株式会社 鈴木宏康
アマゾンデータサービスジャパン株式会社 玉川 憲 片山 暁雄
Logo supportARCHETYP httpwwwarchetypjp