読者です 読者をやめる 読者になる 読者になる

CA MOBILE エンジニアブログ

株式会社シーエー・モバイルのエンジニアブログです

【旧ブログ】EC2に既存サーバをアップロードする方法

cloud linux関連

こんにちは。yymctです。

AWS EC2に弊社の既存の環境を構築する要件があり、既存の環境をEBSのイメージにして EC2インスタンス構築の際にAMIで利用する手順を紹介します。

※前インフラメンバーの方が残されていった手順をもとに実施しており
ほとんどがそのままでインスタンス構築まで実施出来ました。
前任者の記事を、若干、追加/変更いたしました。
また、Amazon Web servicesの使用方法等は省略している箇所があります。
Amazon Web servicesは2013年5月現在のものです。

■実施した構成


【社内サーバ】
・サーバA : イメージ元サーバ(ec2上で動作させたいサーバ)
・サーバB : サーバAのイメージ化ファイル作成用。ec2へのアップロードサーバ
(適当なCentOSで用意)

AWS ec2上のサーバ】
・サーバC : AWS上でEBSイメージ化するサーバ(Amazon Linuxで作成)
・サーバD : EC2上でサーバAを起動させるサーバ


以下、手順です。

■手順1

サーバBにAWS ec2上へアップロードする為の空イメージファイルを作成します。
※後々、サーバAのデータを下記、test.imgに書き込みます。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
901G  110G  744G  13% /
/dev/sda1              99M   26M   69M  28% /boot
tmpfs                 2.0G     0  2.0G   0% /dev/shm

#cd /root
# dd if=/dev/zero of=test.img bs=1M count=10240
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB) copied, 298.681 seconds, 35.9 MB/s

# mke2fs -F -j test.img

# mkdir /mnt/ec2-fs

# mount -o loop test.img /mnt/ec2-fs

■手順2

ec2にアップロードするサーバAを停止します。
停止後、サーバAをsystemresucreCDにて起動します。

systemrescureCD起動後、DISKをマウントするディレクトリを用意します。

ここでは、/mydirとして、「/」 と「/boot」をマウントします。
※「/」がLVM構成の為、dm-0となっているので、構成が異なる場合は適宜変更します。

root@sysresccd /root % mkdir /mydir
root@sysresccd /root % mount -t ext3 /dev/dm-0 /mydir
root@sysresccd /root % mount -t ext3 /dev/sda1 /mydir/boot
root@sysresccd /root % df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                  380960     25052    355908   7% /
udev                     10240       104     10136   2% /dev
/dev/sr0                266540    266540         0 100% /livemnt/boot
/dev/loop0              216064    216064         0 100% /livemnt/squashfs
tmpfs                   380960     25052    355908   7% /livemnt/memory
none                    380960     25052    355908   7% /
tmpfs                   524288        16    524272   1% /livemnt/tftpmem
none                    524288        16    524272   1% /tftpboot
rc-svcdir                 1024        76       948   8% /lib/rc/init.d
udev                     10240       104     10136   2% /dev
shm                     380960         0    380960   0% /dev/shm
tmpfs                   380960        32    380928   1% /tmp
/dev/mapper/VolGroup00-LogVol00
281740776  35719804 231478536  14% /mydir
/dev/sda1               101086     15303     80564  16% /mydir/boot

■手順3

サーバAからサーバBへのコピーはNFSを利用します。
サーバBの空きDISKをNFSマウントし、コピー先のDISKを確保します。
コピー先のディレクトリはサーバB、コピー元のサーバA共に/new-diskとします。

・サーバBでの作業

# mkdir /new-disk
[/cce_teraterm]
NFSサーバ用のdaemonを起動してサーバA(systemrescureCD)で起動したサーバから
マウント可能なように設定をしておきます。
(iptablesのポート許可や/etc/exportsにNFSクライアントの許可など)

・サーバAでの作業

root@sysresccd /root % /etc/init.d/nfsmount start
root@sysresccd /root % mount -t nfs サーバB:/new-disk /new-disk
root@sysresccd /root % df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                  380960     25052    355908   7% /
udev                     10240       104     10136   2% /dev
/dev/sr0                266540    266540         0 100% /livemnt/boot
/dev/loop0              216064    216064         0 100% /livemnt/squashfs
tmpfs                   380960     25052    355908   7% /livemnt/memory
none                    380960     25052    355908   7% /
tmpfs                   524288        16    524272   1% /livemnt/tftpmem
none                    524288        16    524272   1% /tftpboot
rc-svcdir                 1024        76       948   8% /lib/rc/init.d
udev                     10240       104     10136   2% /dev
shm                     380960         0    380960   0% /dev/shm
tmpfs                   380960        32    380928   1% /tmp
/dev/mapper/VolGroup00-LogVol00
281740776  35719804 231478536  14% /mydir
/dev/sda1               101086     15303     80564  16% /mydir/boot
nfsserver:/new-disk  944096736  58491392 836874400   7% /new-disk

■手順4

DISKからDISKへのコピー

サーバA上でcpコマンドを実施します。

# cd /mydir && echo cp -a `/bin/ls -1Ab | egrep -v "^new-disk$|^proc$"` /new-disk | sh

■手順5

サーバB上にはコピーしてきた、/new-diskディレクトリにイメージ化したいサーバのデータが
あるので、手順?で用意したtest.imgファイルにコピーします。
(直接コピーもできるかと思いますが、この方法でやりました。)

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
944096720 115249908 780115884  13% /
/dev/sda1               101086     25961     69906  28% /boot
tmpfs                  2057924         0   2057924   0% /dev/shm
test.img                 10179904   2653240   7009544  28% /mnt/ec2-fs

・サーバBでcpコマンドを実施します。

# cd /new-disk && echo cp -a `/bin/ls -1Ab | egrep -v "^new-disk$|^proc$"` /mnt/ec2-fs | sh

・コピー完了後、proc用を作成しマウントします。

# mkdir /mnt/ec2-fs/proc
# mount -t proc none /mnt/ec2-fs/proc

■手順6

eth0の設定やnetworkファイルの設定をEC2の環境に合わせます。

# vi /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no

# vi /mnt/ec2-fs/etc/sysconfig/network
NETWORKING=yes

・以下SELINUXを停止

# more /mnt/ec2-fs/etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted
# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

・以下を/mnt/ec2-fs/etc/ssh/sshd_confに追記

UseDNS  no
PermitRootLogin without-password

■手順7

EC2用にsshログイン用の公開鍵を起動時に設定するスクリプトを設置し
実行権限の付与も実施します。
※こちらを参考にさせていただきました。
http://vkgtaro.jp/2008/11/10/amazon_ec2_centos5

# cat /mnt/ec2-fs/usr/local/sbin/get-credentails.sh
#!/bin/bash

# Retreive the credentials from relevant sources.

# Fetch any credentials presented at launch time and add them to
# root's public keys

PUB_KEY_URI=http://169.254.169.254/1.0/meta-data/public-keys/0/openssh-key
PUB_KEY_FROM_HTTP=/tmp/openssh_id.pub
PUB_KEY_FROM_EPHEMERAL=/mnt/openssh_id.pub
ROOT_AUTHORIZED_KEYS=/root/.ssh/authorized_keys

# We need somewhere to put the keys.
if [ ! -d /root/.ssh ] ; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi

# Fetch credentials...

# First try http
curl --silent --fail -o $PUB_KEY_FROM_HTTP $PUB_KEY_URI
if [ $? -eq 0 -a -e $PUB_KEY_FROM_HTTP ] ; then
if ! grep -q -f $PUB_KEY_FROM_HTTP $ROOT_AUTHORIZED_KEYS
then
cat $PUB_KEY_FROM_HTTP >> $ROOT_AUTHORIZED_KEYS
echo "New key added to authrozied keys file from parameters"|logger -t "ec2"
fi
chmod 600 $ROOT_AUTHORIZED_KEYS
rm -f $PUB_KEY_FROM_HTTP

elif [ -e $PUB_KEY_FROM_EPHEMERAL ] ; then
# Try back to ephemeral store if http failed.
# NOTE: This usage is deprecated and will be removed in the future
if ! grep -q -f $PUB_KEY_FROM_EPHEMERAL $ROOT_AUTHORIZED_KEYS
then
cat $PUB_KEY_FROM_EPHEMERAL >> $ROOT_AUTHORIZED_KEYS
echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"

fi
chmod 600 $ROOT_AUTHORIZED_KEYS
chmod 600 $PUB_KEY_FROM_EPHEMERAL

fi

if [ -e /mnt/openssh_id.pub ] ; then
if ! grep -q -f /mnt/openssh_id.pub /root/.ssh/authorized_keys
then
cat /mnt/openssh_id.pub >> /root/.ssh/authorized_keys
echo "New key added to authrozied keys file from ephemeral store"|logger -t "ec2"
<div style="display: none"><a href='http://buy-glass-online.com/' title='buy glass pipes online'>buy glass pipes online</a></div>
fi
chmod 600 /root/.ssh/authorized_keys
fi

■実行するためパーミッションの設定

# chmod +x /mnt/ec2-fs/usr/local/sbin/get-credentails.sh

・起動スクリプトへ追記

# cat /mnt/ec-fs2/etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don&#039;t
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/usr/local/sbin/get-credentails.sh

・以下をec2環境用でコピー

# vi /mnt/ec-fs2/etc/modprobe.conf
alias eth0 tg3
alias eth1 tg3
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptsas
alias scsi_hostadapter2 ata_piix

・fstabをec2用に編集

#vi /etc/fstab
/dev/sda1  /         ext3    defaults        0 0
/dev/sdb   /mnt      ext3    defaults        0 0
none       /dev/pts  devpts  gid=5,mode=620  0 0
none       /dev/shm  tmpfs   defaults        0 0
none       /proc     proc    defaults        0 0
none       /sys      sysfs   defaults        0 0

■マウントを外します。

# umount /mnt/ec2-fs/proc
# umount /mnt/ec2-fs

■手順8

test.imgをec2へアップロードする為、Amazon Web Servicesを利用して、
サーバCを作成します。
下記はEC2上のサーバC(Amazon linuxで適当に作成した)インスタンスです。
※サーバCのインスタンス作成手順は省略します。

f:id:yymct:20150920222958j:plain

■手順9

サーバB(社内)から、EC2上のサーバCへtest.imgファイルをアップロードします。
AWS秘密鍵はあらかじめ、サーバBに保存しておきます。

# scp -i xxx.pem /root/test.img ec2-user@xxx.compute.amazonaws.com:

アップロードに数十分待機・・・
サーバCの/home/ec2-user配下にtest.imgファイルが存在する事を確認し、次ぎの手順へ進みます。

■手順10

EC2のサーバCに配置したtest.imgを展開する為、別途、ブートイメージ格納用の
EBSボリュームを作成します。
Amazon Web Servicesの[Volume]メニューから[Create Volume]で新規にボリュームを作成します。
下記例では、「vol-08e90d5e」を作成しています。
※vol-da997d8cはサーバCインスタンス作成時のVolume Diskです。

f:id:yymct:20150920222908j:plain

■手順11

作成したEBSボリューム(vol-08e90d5e)をサーバCのインスタンスへアタッチする為、
「vol-08e90d5e」上で右クリックし、「Attach Volume」を選択します。
サーバCのインスタンス名「i-8b7f858e」にDevice「/dev/sdf」でAttachします。

f:id:yymct:20150920222740j:plain

Attach後、Stateが[available]⇒[in-use]になっている事を確認します。

■手順12

サーバCのコンソールにログインして、test.imgをEBSボリューム(vol-08e90d5e)にコピーします。

[root@ip-10-???-???-??? ~]# fdisk -l

Disk /dev/xvda1: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvdf: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

・ddコマンドで追加したボリュームへコピー

[root@ip-10-???-???-??? ~]# dd if=test.img of=/dev/sdf

・サーバC上でEBSボリューム(vol-08e90d5e)の内容をマウントして確認します。

[root@ip-10-???-???-??? ~]# mkdir /mnt/ebs
[root@ip-10-???-???-??? ~]# mount /dev/sdh /mnt/ebs/
[root@ip-10-???-???-??? ~]# df
Filesystem?????????? 1K-blocks????? Used Available Use% Mounted on
/dev/xvda1???????????? 8256952?? 6252460?? 1920636? 77% /
tmpfs?????????????????? 304240???????? 0??? 304240?? 0% /dev/shm
/dev/xvdf????????????? 5160576?? 4986356???????? 0 100% /mnt/ebs
[root@ip-10-???-???-??? ~]# cd /mnt/ebs/
[root@ip-10-???-???-??? ebs]# ls -ltr
drwxr-xr-x? 2 root root? 4096 Mar 29? 2007 srv
drwxr-xr-x? 2 root root? 4096 Mar 29? 2007 opt
drwxr-xr-x? 2 root root? 4096 Mar 29? 2007 mnt
drwxr-xr-x? 2 root root? 4096 Mar 29? 2007 media
drwx------? 2 root root 16384 Jul 26? 2008 lost+found
drwxr-xr-x? 2 root root? 4096 Jul 26? 2008 sys
drwxr-xr-x? 2 root root? 4096 Jul 26? 2008 selinux
drwxr-xr-x? 4 root root? 4096 Jul 26? 2008 boot
drwxr-xr-x? 2 root root? 4096 Jul 26? 2008 service
drwxr-xr-x 10 root root? 4096 Jul 27? 2008 lib
drwxr-xr-x? 8 root root? 4096 Jul 27? 2008 lib64
drwxr-xr-x? 2 root root? 4096 Jul 27? 2008 sbin
drwxr-xr-x 19 root root? 4096 Aug? 8? 2008 var
drwxr-xr-t? 3 root root? 4096 Aug? 8? 2008 package
drwxr-xr-x? 2 root root? 4096 Aug? 8? 2008 command
drwxr-xr-x 17 root root? 4096 Oct? 4? 2008 usr
drwxr-xr-x 10 root root? 4096 Oct? 9? 2008 home
drwxr-xr-x? 2 root root? 4096 Dec 24? 2008 bin
drwxr-xr-x? 4 root root? 4096 Apr 10 01:15 dev
drwxrwxrwt? 7 root root 32768 Apr 10 01:40 tmp
drwxr-x---? 9 root root? 4096 Apr 10 01:40 root
lrwxrwxrwx? 1 root root??? 18 Apr 18 04:46 apache -> /usr/local/apache2
lrwxrwxrwx? 1 root root???? 6 Apr 18 04:49 x -> /usr/x
drwxr-xr-x? 2 root root? 4096 Apr 18 04:51 proc
drwxr-xr-x 57 root root? 4096 Apr 18 05:09 etc
[root@ip-10-???-???-??? ebs]# mount
/dev/xvda1 on / type ext4 (rw,noatime)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/xvdf on /mnt/ebs type ext3 (rw)
[root@ip-10-???-???-??? ebs]# more /mnt/ebs/etc/fstab
/dev/sda1? /???????? ext3??? defaults??????? 0 0
/dev/sdb?? /mnt????? ext3??? defaults??????? 0 0
none?????? /dev/pts? devpts? gid=5,mode=620? 0 0
none?????? /dev/shm? tmpfs?? defaults??????? 0 0
none?????? /proc???? proc??? defaults??????? 0 0
none?????? /sys????? sysfs?? defaults??????? 0 0

[root@ip-10-???-???-??? ebs]# umount /mnt/ebs

■手順13

アタッチしたボリュームをデタッチします。
Amazon Web Services EC2上メニューの 「Volume」から「vol-08e90d5e」を
右クリックし、「Force Detach」を選択。

■手順14

SnapShotを作成
Amazon Web ServicesのEC2メニューから「ELASTIC BLOCK STORE」→「Snapshots」→「Create Snapshop」を選択し、新規にsnapshotを作成します。
f:id:yymct:20150920222626j:plain

■手順15

SnapShotができたらAMIの作成
作成したSnapshotからAMI image(Create Image from Snapshotから)を作成します。
f:id:yymct:20150920222412j:plain

[Create Image from Snapshot]を選択します。

f:id:yymct:20150920222459j:plain

■手順16

AMIが作成された事を確認します。
Amazon Web Servicesの[IMAGES]→[AMI]を選択する。
f:id:yymct:20150920222319j:plain

■手順17

最後にAWS EC2上用サーバDを作成します。
[Launch Instance]→[Classic Wizard]→[My AMIs]を選択し前述手順で作成した
AMI(test_imge_ebs_ami)を選択します。
KernelIDとRAMIDは以下の通り指定します。
※環境に合わせて設定しないと正常に起動しない事がある為、注意する事。
・Kernel ID: [ aki-a409a2a5 ]
・RAM Disk ID: [ ari-a009a2a1 ]

インスタンス作成後、サーバDの正常起動、ログイン成功を確認した完了となります。
これで社内の既存サーバAがEC2でサーバDとして動作可能になります。

今後の課題としてはカーネル環境不一致による問題がある為、更なる改善と
/etc/passwd,shadow,groupや/root/.sshなどのファイルは
社内環境そのままのため、EC2用に作成し直す事でセキュリティを意識する必要がありそうです。

zp8497586rq