Amazon EC2의 제한점이라면 EC2 인스턴스의 동일본이 다른 지역으로 복사가 안된다는 점입니다.


아래와 같이 여러 많은 방법들이 소개되고 있다. 스크립트도 쓰고, 별의 별 방법을 다 동원하고 있지만 접근하기는 쉽지가 않습니다.


http://alestic.com/2010/10/ec2-ami-copy 


http://blog.ibd.com/scalable-deployment/copy-an-ebs-ami-image-to-another-amazon-ec2-region/ 



간단한 방법으로 인스턴스의 이미지를 다른 지역으로 복사하는 방법을 설명합니다.


1. 먼저 현재 EBS 또는 S3 형태의 볼륨보다 큰 EBS 볼륨을 관리콘솔에서 생성하여 복사할 EC2인스턴스에 attach시킵니다.


[root@ip-10-224-114-237 ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/sda1              30G  4.0G   25G  15% /

tmpfs                 308M     0  308M   0% /dev/shm



위의 파일 시스템을 보면 30G 짜리의 /dev/sda1으로 root가 mount되어 있습니다. 


2. 위의 루프파일 시스템보다 큰 크기인 40G 정도의 볼륨을 생성하여 마운트 시킵니다.

$> mkfs -t ext3 /dev/sdg

$> mkdir -p /mnt/sdg

$> mount -t ext3 /dev/sdg /mnt/sdg


3. 마운트가 끝나면 현재의 루프파일 시스템을 dd명령을 이용하여 mnt/sdg에 생성한 후 압축합니다.

$> dd if=/dev/sda1 of=/mnt/sdg/template bs=10M

$> tar -zcvf template.tar.gz /mnt/sdg/template


4. 아마존 콘솔을 이용하여 대상지역(target region)에 EC2 인스턴스를 micro로 생성합니다. 생성 후 위의 /dev/sda1과 동일한 크기의 EBS를 생성하여 신규 시스템에 attach 시킵니다.

위의 예에서는 30G짜리의 EBS를 사용했으므로 동일하게 30G짜리를 생성합니다.

$> mkfs -t ext3 /dev/sdg

$> mkdir -p /mnt/sdg

$> mount -t ext3 /dev/sdg /mnt/sdg



5. Source측의 압축된 template.tar.gz파일을 #4에서 생성된 인스턴스로 scp를 사용하여 전송합니다.

$> chmod 600 target-region.pem

$> scp -i target-region.pem  template.tar.gz root@ec2-176-34-228-119.eu-west-1.compute.amazonaws.com:~/



6. 대상지역에서 template.tar.gz의 압축을 푼 후, dd명령을 이용하여 attach된 볼륨에 template을 복제합니다.

$> tar -zxvf template.tar.gz

#> dd if=template of=/dev/sdg bs=10M


7. 위의 /dev/sdg의 마운트를 해제합니다.

$> umount /dev/sdg


8. 아마존 콘솔에서 해당 EBS 볼륨에 대한 스냅샷을 생성합니다.

아마존 콘솔(Amazon Console) -> Volume -> Create snapshot


9. EC2 command line tool을 이용하여 해당 스냅샷을 이용한 인스턴스를 생성합니다.

http://docs.amazonwebservices.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-RegisterImage.html


linux-box-source:~/ec2-api-tools-1.4.2.4$ ./bin/ec2-register --private-key pk-your.pem --cert cert-your.pem -v -H --region eu-west-1 -a  x86_64 -s snap-a485f7cc  -d 'CopyAMI Generated' -n 'AMI_DESCRIPTION' --root-device-name /dev/sda1 --kernel aki-5f7f552b



명령어 입력전에 ec2-api-tool이 반드시 설치되어 있어야 한다. 커널 아이디 'aki-5f7f552b'는 OEL5.5의 기본 커널 아이디이며, snap-a485f7cc 는 위에서 생성된 스냅샷, 대상 지역은 복사하고자 하는 위치입니다.



위의 private-key와 cert-key는 Amazon Console의 오른쪽 위의 Security Credentials의 CREDENTIALS의 X.509 탭을 누르면 나오는 "CREATE A NEW CERTIFICATE" 버튼을 눌러 나타나는 키를 다운받습니다.


10. 생성이 완료되면 아마존 콘솔에서 대상지역의 AMI를 보면 방금 생성한 AMI가 보일것이다.

생성된 AMI를 이용하여 인스턴스를 launch합니다.


11. 아마존 인스턴스의 경우 swap은 복사되지 않으므로 새로운 swap volume을 생성하여 인스턴스에 attach한 후 스왑을 만들어줘야 합니다.


fdisk /dev/sdf

          Command (m for help): n

          Command action

             e   extended

             p   primary partition (1-4)

          p

          Partition number (1-4): 1

          First cylinder (1-1044, default 1): 

          Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): 

          

          Command (m for help): t

          Selected partition 1

          Hex code (type L to list codes): 82

          Changed system type of partition 1 to 82 (Linux swap / Solaris)

          

          Command (m for help): w

          The partition table has been altered!

          

          Calling ioctl() to re-read partition table.

          Syncing disks.

> mkswap /dev/sdf1


/etc/fstab을 편집하여 다음을 추가합니다.

[root@ip-10-124-189-22 ~]# cat /etc/fstab

/dev/sda1                 /                       ext3    defaults        1 1

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/sdf1               none                    swap    sw,nobootwait   0 0




12. 모든 것이 완료되었다. template ami를 생성하기 위해 아래의 명령을 실행하고 create ami로 해당 지역의 템플릿을 생성합니다.

chmod a+x /etc/rc.d/ec2.sh

 cat /dev/null > /var/log/boot.log

 cat /dev/null > /var/log/cron.log

 cat /dev/null > /var/log/dmesg.log

 cat /dev/null > /var/log/maillog.log

 cat /dev/null > /var/log/messages.log

 cat /dev/null > /var/log/oraclevm-template.log

 cat /dev/null > /var/log/secure

 cat /dev/null > /var/log/audit/audit.log

 cat /dev/null > /var/log/cups/error_log

 cat /dev/null > /root/.bash_history

 history -c



출처 http://www.javapattern.info/421



Posted by 나랑살자
,