全リージョンに一気に同じAMIをdeployしてみた

Vyatta Core 6.5が出たので、全リージョンにAMIを効率的に配置するための方法を考えてみた。

事前準備

  1. psshをインストールしておきます
  2. "AMI"という名前で、EC2の操作ができるIAM Roleを作成しておきます
  3. default SecurityGroupはsshが出来るように設定します
  4. 全リージョン共通で同じkeypairを使えるようにしておきます(KEYPAIRをインポートする)
  5. https://gist.github.com/4122817 から一式cloneします ( git clone git://gist.github.com/4122817.git bulkami など )

オリジナルAMIの作成

まずどこかのリージョンで元となるAMIを作り込んでおきます。今回は東京リージョンで作業を行いました。
基本的には"Vyatta Core 6.3のAMIを作ってみた - log4moto"と同じ方法でAMIを作成し、これといった物が出来たら、root volumeのイメージをファイルにして、s3にPublic readできるようにしてアップロードします。

# dd if=/dev/sdf of=root.bin
# gzip root.bin
# s3cmd -P put root.bin.gz s3://bucket/

作業用インスタンスの起動

こちらのスクリプトを使用します。

引数に作成するAMIのroot volume sizeを入れます(デフォルトは1GB)。そうすると、/dev/sdfにその容量のEBSを持つAmazon Linux AMIが起動され、ホストの一覧ファイル(hosts.txt)が生成されます。
起動後にpsshで接続確認をします。

$ ./launch.sh 1
 :
$ alias p="pssh -h hosts.txt -i -t 600"
$ p hostname
[1] 12:33:49 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
ip-10-156-203-136
[2] 12:33:50 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
ip-10-142-111-218
[3] 12:33:50 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
ip-10-222-106-38
[4] 12:33:50 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
ip-10-248-20-106
[5] 12:33:51 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
ip-10-60-6-185
[6] 12:33:52 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
ip-10-248-35-159
[7] 12:33:52 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
ip-10-48-50-206
[8] 12:33:52 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
ip-10-252-67-169

※起動中だったりするとtimeoutしたりしますので、完全に起動するまで待ちます。

スクリプトの実行

こちらのスクリプトを使います。

実行例

$ ./deploy.sh 
usage: ./deploy.sh image-url image-name image-description image-arch
$ ./deploy.sh http://bucket.s3.amazonaws.com/root.bin.gz "AMI NAME" "AMI DESCRIPTION" x86_64
setting region to .bashrc // this should be run once, but no harm if run multiple times
[1] 12:43:23 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[2] 12:43:24 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[3] 12:43:24 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[4] 12:43:24 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[5] 12:43:25 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
[6] 12:43:26 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
[7] 12:43:26 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
[8] 12:43:26 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
remove if image file exists
[1] 12:43:27 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[2] 12:43:28 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[3] 12:43:28 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[4] 12:43:28 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
[5] 12:43:28 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[6] 12:43:29 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
[7] 12:43:30 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
[8] 12:43:30 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
download and decompress image file
[1] 12:44:02 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[2] 12:44:19 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[3] 12:44:20 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[4] 12:44:22 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
[5] 12:44:26 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[6] 12:44:48 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
[7] 12:44:55 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
[8] 12:45:13 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
writing image to volume
[1] 12:47:13 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 117.778 s, 9.1 MB/s
[2] 12:47:18 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 120.258 s, 8.9 MB/s
[3] 12:47:39 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 144.906 s, 7.4 MB/s
[4] 12:47:50 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 155.025 s, 6.9 MB/s
[5] 12:48:07 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 172.357 s, 6.2 MB/s
[6] 12:48:19 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 182.316 s, 5.9 MB/s
[7] 12:48:20 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 184.444 s, 5.8 MB/s
[8] 12:48:31 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
Stderr: 2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 193.77 s, 5.5 MB/s
checking AKI
[1] 12:48:37 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
[2] 12:48:38 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[3] 12:48:39 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[4] 12:48:39 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
[5] 12:48:39 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[6] 12:48:41 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
[7] 12:48:41 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[8] 12:48:43 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
taking snapshot
[1] 12:48:49 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[2] 12:48:50 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[3] 12:48:50 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
[4] 12:48:50 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[5] 12:48:51 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[6] 12:48:51 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
[7] 12:48:52 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
[8] 12:48:53 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
(※snapshot作成からAMI登録まで3分間決めうちで待つアレな仕様となっております)
register
[1] 12:51:56 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[2] 12:51:57 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
[3] 12:51:57 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[4] 12:51:57 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[5] 12:51:57 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[6] 12:51:58 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
[7] 12:51:59 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
[8] 12:52:00 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com

これでAMIが各リージョンで登録され、amiというファイルにami-idが入っています。

試験起動

$ p 'xargs ec2-run-instances -t t1.micro -k KEYPAIR < ami | grep ^INSTANCE | cut -f 2 > instance'
[1] 12:59:42 [SUCCESS] ec2-54-248-146-82.ap-northeast-1.compute.amazonaws.com
[2] 12:59:42 [SUCCESS] ec2-54-251-79-80.ap-southeast-1.compute.amazonaws.com
[3] 12:59:42 [SUCCESS] ec2-54-252-38-129.ap-southeast-2.compute.amazonaws.com
[4] 12:59:43 [SUCCESS] ec2-54-241-93-22.us-west-1.compute.amazonaws.com
[5] 12:59:43 [SUCCESS] ec2-54-245-137-71.us-west-2.compute.amazonaws.com
[6] 12:59:43 [SUCCESS] ec2-107-22-129-102.compute-1.amazonaws.com
[7] 12:59:44 [SUCCESS] ec2-46-51-145-192.eu-west-1.compute.amazonaws.com
[8] 12:59:45 [SUCCESS] ec2-54-232-11-145.sa-east-1.compute.amazonaws.com
$ p "xargs ec2-describe-instances < instance | grep ^INSTANCE | cut -f 4" | grep ^ec2 | tee testhosts.txt
ec2-54-248-29-242.ap-northeast-1.compute.amazonaws.com
ec2-54-251-0-235.ap-southeast-1.compute.amazonaws.com
ec2-54-241-120-57.us-west-1.compute.amazonaws.com
ec2-54-252-39-135.ap-southeast-2.compute.amazonaws.com
ec2-50-112-235-167.us-west-2.compute.amazonaws.com
ec2-50-16-72-193.compute-1.amazonaws.com
ec2-79-125-58-29.eu-west-1.compute.amazonaws.com
ec2-177-71-160-118.sa-east-1.compute.amazonaws.com
$ pssh -i -h testhosts.txt -l vyatta whoami
[1] 13:03:21 [SUCCESS] ec2-54-248-29-242.ap-northeast-1.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[2] 13:03:22 [SUCCESS] ec2-54-251-0-235.ap-southeast-1.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[3] 13:03:22 [SUCCESS] ec2-54-241-120-57.us-west-1.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[4] 13:03:22 [SUCCESS] ec2-54-252-39-135.ap-southeast-2.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[5] 13:03:22 [SUCCESS] ec2-50-112-235-167.us-west-2.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[6] 13:03:23 [SUCCESS] ec2-50-16-72-193.compute-1.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[7] 13:03:24 [SUCCESS] ec2-79-125-58-29.eu-west-1.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta
[8] 13:03:24 [SUCCESS] ec2-177-71-160-118.sa-east-1.compute.amazonaws.com
vyatta
Stderr: Welcome to Vyatta

無事にAMIがdeployできたようです。

公開するには

$ p "xargs ec2-modify-image-attribute -l -a all < ami"

と実行する事で、全ユーザに公開する事ができます。
特定ユーザに公開するには、

$ p "xargs ec2-modify-image-attribute -l -a xxxxxxxxxxxx < ami"

と、アカウントIDを指定して実行します。