全リージョンに一気に同じAMIをdeployしてみた
Vyatta Core 6.5が出たので、全リージョンにAMIを効率的に配置するための方法を考えてみた。
事前準備
- psshをインストールしておきます
- "AMI"という名前で、EC2の操作ができるIAM Roleを作成しておきます
- default SecurityGroupはsshが出来るように設定します
- 全リージョン共通で同じkeypairを使えるようにしておきます(KEYPAIRをインポートする)
- 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を指定して実行します。