CentOS 6.0のAMI用ディスクイメージ作成

 article  Comments Off on CentOS 6.0のAMI用ディスクイメージ作成
Dec 162012
 

■2013/02/17追記
CentOSコミュニティで公式AMIを提供しはじめましたのでそちらを使ったほうがよいと思います。

CentOS 6.0 x86_64のAMIベースになるディスクイメージを作成してみました。

CentOS 5.0用を作ったときと違ってcloud-initも最初から入れちゃいます。

  1. 作業用のRed Hat 6系列Linuxを環境を準備(EC2上に用意)
  2. 2GiBのEBSボリュームを用意してCentOS 6.0を最小構成インストール
  3. PV-GRUBでブートできるようにinitrdやgrub.confを構成
  4. 仕上がったEBSボリュームのスナップショットを取得しAMIとして登録

5.0のときと違って、最初から最後までEC2上で作業していきます。

今回参考にした情報は以下です。
From a Loopback – Amazon Elastic Compute Cloud
Enabling Your Own Linux Kernels – Amazon Elastic Compute Cloud

作業用マシン準備
EC2標準のRHEL6(x86_64)を起動します。
EBSボリュームマウント先として/mnt/ec2-fsを作成します。

[root@localhost ~]# mkdir /mnt/ec2-fs

selinux関連パッケージにエラーになるため、作業マシンでは無効化しておきます。

[root@localhost ~]# setenforce 0

EBS準備
2GiBのEBSボリュームを用意して/dev/xvdjにマウントします。xvdjにしているのはRHEL6でデバイスファイルが用意されていたから。

[root@localhost ~]# mkfs.ext4 /dev/xvdj
[root@localhost ~]# mount /dev/xvdj /mnt/ec2-fs

yumインストール用の設定ファイルを作成
6.0素の最小構成しますので、baseリポジトリのみ有効(updatesは無効)にしています。
6.0のリポジトリは既にvaultに移っていますので、baseurlではそちらを指定します。

[root@localhost ~]# vi centos-6-0-x86_64-yum.conf
[root@localhost ~]# cat centos-6-0-x86_64-yum.conf
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null

[base]
name=CentOS-6.0 - Base
baseurl=http://vault.centos.org/6.0/os/x86_64/

[updates]
name=CentOS 6.0 - Updates
baseurl=http://vault.centos.org/6.0/updates/x86_64/
enabled=0

必要最低限のパッケージをインストール
パッケージグループCoreをインストールします。
パッケージkerel-xenをインストールします。

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y groupinstall Core
:
Install     181 Package(s)

Total download size: 88 M
Installed size: 324 M
:

展開サイズは324Mですので、2GiBのEBSでも十分足ります。

/etc/fstab作成
kernelパッケージのインストール時にinitrdが生成されますが、その際fstabの記述に従ってrootパーティションのマウント指定が決定されますので記述を用意します。
ちなみに作業マシンのRHEL6とほぼ同じになります。

[root@localhost ~]# vi /mnt/ec2-fs/etc/fstab
[root@localhost ~]# cat /mnt/ec2-fs/etc/fstab
LABEL=_/   /         ext4    defaults        1 1
none       /proc     proc    defaults        0 0
none       /sys      sysfs   defaults        0 0
none       /dev/pts  devpts  gid=5,mode=620  0 0
none       /dev/shm  tmpfs   defaults        0 0

fstab指定に合わせてLABELを作成します。

[root@localhost ~]# e2label /dev/xvdj _/
[root@localhost ~]# e2label /dev/xvdj
_/

/etc/modprobe.conf作成
こちらもfstab同様にkernelインストール前に実施しておき、initrdイメージにxen関連のモジュールが含まれるようにします。

[root@localhost ~]# cat >> /mnt/ec2-fs/etc/modprobe.conf << EOF
alias eth0 xennet
alias scsi_hostadapter xenblk
EOF
[root@localhost ~]# tail -2 /mnt/ec2-fs/etc/modprobe.conf
alias eth0 xennet
alias scsi_hostadapter xenblk

パッケージkernelをインストールします。

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y install kernel

クリーンアップ

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs clean all

デバイスファイルの作成

[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x console
[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x null
[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x zero

/boot/grub/grub.conf作成
EBS内のkernelで起動できるように用意しておきます。

[root@localhost ~]# vi /mnt/ec2-fs/boot/grub.conf
[root@localhost ~]# cat /mnt/ec2-fs/boot/grub.conf
default=0
timeout=0
hiddenmenu
title CentOS (2.6.32-71.el6)
        root (hd0)
        kernel /boot/vmlinuz-2.6.32-71.el6.x86_64 root=LABEL=_/ ro
        initrd /boot/initramfs-2.6.32-71.el6.x86_64.img
[root@localhost ~]# cd /mnt/ec2-fs/boot
[root@localhost boot]# ln -s grub.conf menu.lst
[root@localhost boot]# cd

/etc/sysconfig/network作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/sysconfig/network
[root@localhost ~]# cat /mnt/ec2-fs/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no

/etc/sysconfig/network-scripts/ifcfg-eth0作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# cat /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=on

/etc/resolv.conf作成

[root@localhost ~]# touch /mnt/ec2-fs/etc/resolv.conf

SELinux無効化
/etc/selinux/configのSELINUXをdisabledに変更します。

[root@localhost ~]# vi /mnt/ec2-fs/etc/selinux/config
[root@localhost ~]# grep ^SELINUX= /mnt/ec2-fs/etc/selinux/config
SELINUX=disabled

cloud-initパッケージ導入用にEPELリポジトリ設定をインストールし、AMI構築用のyum設定ファイルに結合します。

[root@localhost ~]# rpm --root=/mnt/ec2-fs -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-7.noarch.rpm
[root@localhost ~]# cat /mnt/ec2-fs/etc/yum.repo.d/epel.repo >> centos-6-0-x86_64-yum.conf

cloud-initパッケージをインストールします。

[root@localhost ~]# yum -c centos-6-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y install cloud-init

EPELリポジトリは通常利用しないよう無効化しておきます。

[root@localhost ~]# vi /mnt/ec2-fs/etc/yum.repos.d/epel.repo
[root@localhost ~]# grep ^enabled /mnt/ec2-fs/etc/yum.repos.d/epel.repo 
enabled=0
enabled=0
enabled=0

ec2-user作成
cloud-initのデフォルト構成で初回ログインユーザーになるec2-userを作成します。

[root@localhost ~]# chroot /mnt/ec2-fs /usr/sbin/useradd ec2-user
[root@localhost ~]#

EBSボリュームのアンマウント

[root@localhost ~]# umount /mnt/ec2-fs

アンマウントしたEBSボリュームのスナップショットを取得し、AMI登録すれば完了なはず。

CentOS 5.0のAMI用ディスクイメージ作成

 article  Comments Off on CentOS 5.0のAMI用ディスクイメージ作成
Apr 152012
 

CentOS 5.0 x86_64のAMIベースになるディスクイメージを作成してみました。

最初Amazon Linuxでも使われているcloud-initをrpm化してインストールしておこうと思ったのですが、Python2.6の敷居が思いのほか高く、ssh鍵の配置のみrc.localに記述する方式にしています。
CentOS 6以上ならrpm化してcloud-initを入れておくと便利だと思います。

■2012/12/03追記:cloud-initはEPELリポジトリでパッケージが提供されています。手元の環境(CentOS 5.2)で使えました。

  1. 作業用のCentOS 5.0環境を準備(VMware Player上に用意)
  2. ディスクイメージファイルを作成してCentOS 5.0を最小構成インストール
  3. PV-GRUBでブートできるようにinitrdやgrub.confを構成

作成したディスクイメージファイルをEBSに書き出してスナップショットからEBSなAMIを作成することもきますし、そのままInstance StoreなAMIを作成することもできます。
作業用のCentOS 5環境をAWS上に用意できれば、ディスクイメージファイルではなく直接EBSボリュームに構築することもできます。

今回参考にした情報は以下です。
From a Loopback – Amazon Elastic Compute Cloud
AWS Developer Forums: CentOS 5, ID# ami-07ca2f6e, can not SSH …
Enabling Your Own Linux Kernels – Amazon Elastic Compute Cloud

作業用ディレクトリ作成
ディスクイメージ配置用に~/ami、ディスクイメージマウント先は/mnt/ec2-fsを作成します。

[root@localhost ~]# mkdir ~/ami /mnt/ec2-fs

ディスクイメージ準備
2GBのディスクイメージを作成して、フォーマット後ループバックマウントします。

[root@localhost ~]# dd if=/dev/zero of=ami/centos-5-0-x86_64-core.img bs=1M count=2048
[root@localhost ~]# mke2fs -F -j ami/centos-5-0-x86_64-core.img
[root@localhost ~]# mount -o loop ami/centos-5-0-x86_64-core.img /mnt/ec2-fs

yumインストール用の設定ファイルを作成
5.0素の最小構成しますので、baseリポジトリのみ有効(updatesは無効)にしています。
5.0のリポジトリは既にvaultに移っていますので、baseurlではそちらを指定します。

[root@localhost ~]# vi ami/centos-5-0-x86_64-yum.conf
[root@localhost ~]# cat ami/centos-5-0-x86_64-yum.conf
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
exclude=*-debuginfo
gpgcheck=0
obsoletes=1
reposdir=/dev/null

[base]
name=CentOS-5.0 - Base
baseurl=http://vault.centos.org/5.0/os/x86_64/

[updates]
name=CentOS 5.0 - Updates
baseurl=http://vault.centos.org/5.0/updates/x86_64/
enabled=0

必要最低限のパッケージをインストール
パッケージグループCoreとkerel-xen、そしてssh鍵の配置に必要なcurlをインストールします。curlインストール時はi386パッケージがインストールされないよう、curl.x86_64と指定しています。

[root@localhost ~]# yum -c ami/centos-5-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y groupinstall Core
[root@localhost ~]# yum -c ami/centos-5-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y install kernel-xen
[root@localhost ~]# yum -c ami/centos-5-0-x86_64-yum.conf --installroot=/mnt/ec2-fs -y install curl.x86_64

クリーンアップ

[root@localhost ~]# yum -c ami/centos-5-0-x86_64-yum.conf --installroot=/mnt/ec2-fs clean all

デバイスファイルの作成

[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x console
[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x null
[root@localhost ~]# /mnt/ec2-fs/sbin/MAKEDEV -d /mnt/ec2-fs/dev -c /mnt/ec2-fs/etc/makedev.d -x zero

/etc/fstab作成
mkinitrdでのinitrd生成時に、fstabの記述に従ってrootパーティションのマウント指定が決定されます。

[root@localhost ~]# vi /mnt/ec2-fs/etc/fstab
[root@localhost ~]# cat /mnt/ec2-fs/etc/fstab
/dev/sda1       /               ext3    defaults,noatime        1 1
devpts          /dev/pts        devpts  gid=5,mode=620          0 0
tmpfs           /dev/shm        tmpfs   defaults                0 0
proc            /proc           proc    defaults                0 0
sysfs           /sys            sysfs   defaults                0 0

/etc/modprobe.conf作成
mkinitrdでのinitrd生成時にxennetとxenblkが含まれるようにモジュールの記述を追加します。

[root@localhost ~]# cat >> /mnt/ec2-fs/etc/modprobe.conf << EOF
alias eth0 xennet
alias scsi_hostadapter xenblk
EOF
[root@localhost ~]# tail -2 /mnt/ec2-fs/etc/modprobe.conf
alias eth0 xennet
alias scsi_hostadapter xenblk

initrdを生成
chrootしてmkinitrdします。

[root@localhost ~]# chroot /mnt/ec2-fs /bin/bash
[root@localhost /]# mkinitrd initrd.new 2.6.18-8.el5xen
[root@localhost /]# mv initrd.new /boot/initrd-2.6.18-8.el5xen.img
[root@localhost /]# exit

/boot/grub/grub.conf作成
EBS内のkernelで起動できるように用意しておきます。

[root@localhost ~]# vi /mnt/ec2-fs/boot/grub.conf
[root@localhost ~]# cat /mnt/ec2-fs/boot/grub.conf
default=0
timeout=0
hiddenmenu
title CentOS (2.6.18-8.el5xen)
        root (hd0)
        kernel /boot/vmlinuz-2.6.18-8.el5xen ro root=/dev/sda1
        initrd /boot/initrd-2.6.18-8.el5xen.img
[root@localhost ~]# cd /mnt/ec2-fs/boot
[root@localhost boot]# ln -s grub.conf menu.lst
[root@localhost boot]# cd

/etc/hosts作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/hosts
[root@localhost ~]# cat /mnt/ec2-fs/etc/hosts
127.0.0.1               localhost.localdomain localhost

/etc/sysconfig/network作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/sysconfig/network
[root@localhost ~]# cat /mnt/ec2-fs/etc/sysconfig/network
NETWORKING=yes

/etc/sysconfig/network-scripts/ifcfg-eth0作成

[root@localhost ~]# vi /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# cat /mnt/ec2-fs/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no

/etc/resolv.conf作成

[root@localhost ~]# touch /mnt/ec2-fs/etc/resolv.conf

SELinux無効化
/etc/selinux/configのSELINUXをdisabledに変更します。

[root@localhost ~]# vi /mnt/etc/selinux/config
[root@localhost ~]# grep ^SELINUX= /mnt/etc/selinux/config
SELINUX=disabled

/usr/local/sbin/get-credentials.sh作成

[root@localhost ~]# vi /mnt/ec2-fs/usr/local/sbin/get-credentials.sh
[root@localhost ~]# chmod 700 /mnt/ec2-fs/usr/local/sbin/get-credentials.sh
[root@localhost ~]# chown 0:0 /mnt/ec2-fs/usr/local/sbin/get-credentials.sh
[root@localhost ~]# cat /mnt/ec2-fs/usr/local/sbin/get-credentials.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 --retry 3 --retry-delay 0 --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"

        fi
        chmod 600 /root/.ssh/authorized_keys
fi

/etc/rc.localにget-credentials.sh実行を追加

[root@localhost ~]# cat >> /mnt/ec2-fs/etc/rc.local <<EOF
# Get your chosen keypair credentials
/usr/local/sbin/get-credentials.sh
EOF
[root@localhost ~]# tail -2 /mnt/ec2-fs/etc/rc.local
# Get your chosen keypair credentials
/usr/local/sbin/get-credentials.sh

ディスクイメージのアンマウント

[root@localhost ~]# umount /mnt/ec2-fs

AMI化するところは別途。

Amazon EC2、1週間使って料金発生

 article  Comments Off on Amazon EC2、1週間使って料金発生
Mar 012011
 

Ubuntu 10.10 on Amazon EC2 Micro instanceでAWSを使い始めて1週間経過しました。
1年間無料につられましたが甘かったです。1週間で無料範囲を超過しました。このペースだと月$3弱かかる見込みです。それでも十分に安いとは思うのですが。

AWS Fees of 1st week

AWS Fees of 1st week

EBSのI/Oリクエスト数が1,000,000を越えたとのことです。

現在動かしているのはZabbixとMuninとIcingaの監視ツール群だけ。しかも自身の監視しかおこなっていません。
実は一時設定を間違えて、Muninの処理時間が400秒を超える状況に陥ったのですが、その際のI/Oが半端なかったのでしょうか 😕

Ubuntu 10.10 on Amazon EC2 Micro instance

 article  Comments Off on Ubuntu 10.10 on Amazon EC2 Micro instance
Feb 202011
 

1年間無料のAmazon EC2 Micro instanceで何かしらのLinuxをうごかしてみようかと調べたところ、

Fedoraはinstance imageの提供のみだったようですのでUbuntu 10.10を動かしてみます。

CentOSはRightScale提供のものが有名なようです。
余談ですがこれらのAMI提供状況を調べていて、DistroWatch.comのランキングでUbuntuがFedoraを抜いて1位になった理由を垣間見た気がしました。

AWSコンソールでアカウント設定やアクセスキーの取得は済んでいますので、以降はAmazon EC2 API Tools : Developer Tools : Amazon Web Servicesをダウンロードしコマンドラインで操作します。

環境変数を設定します。

set EC2_HOME=C:\ec2
set EC2_PRIVATE_KEY=%EC2_HOME%\pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
set EC2_CERT=%EC2_HOME%\cert-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
set EC2_URL=https://ec2.ap-southeast-1.amazonaws.com
set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_23"
set PATH=%EC2_HOME%\bin;%PATH%

セキュリティグループを作成します。SSHとHTTPSのみを許可します。

C:\ec2\bin>ec2-add-group gmt24grp -d "gmt24 security group"
GROUP   gmt24grp        gmt24 security group

C:\ec2\bin>ec2-authorize gmt24grp -p 22
GROUP           gmt24grp
PERMISSION              gmt24grp        ALLOWS  tcp     22      22      FROM    CIDR    0.0.0.0/0

C:\ec2\bin>ec2-authorize gmt24grp -p 443
GROUP           gmt24grp
PERMISSION              gmt24grp        ALLOWS  tcp     443     443     FROM    CIDR    0.0.0.0/0

-dオプションで指定するDescriptionにスペースを含む場合、ダブルクォート(“)で括る必要があります。シングルクォート(‘)ではなぜかダメでした。

結果はec2-describe-groupコマンドで表示できます。

C:\ec2\bin>ec2-describe-group gmt24grp
GROUP   948879270918    gmt24grp        gmt24 security group
PERMISSION      948879270918    gmt24grp        ALLOWS  tcp     22      22      FROM    CIDR    0.0.0.0/0
PERMISSION      948879270918    gmt24grp        ALLOWS  tcp     443     443     FROM    CIDR    0.0.0.0/0

最初に確認したUbuntu 10.10のAMIを使ってインスタンスを起動してみます。

C:\ec2\bin>ec2-run-instances ami-0c423c5e --instance-type t1.micro --region ap-southeast-1 --key gmt24key --group gmt24grp

以上でサクっと起動完了。
引数に指定しているami-0c423c5eはUbuntu 10.10 (Maverick Meerkat)に掲載されている、Region=ap-southeast-1,arch=32bit,root store=ebsのAMIです。

sshでのアクセス方法はAWSコンソールで確認して(コマンドでの方法わからなかった)、ubuntuユーザーでログインできます 🙂

今回参考にさせていただいたサイトは以下です。コマンドラインからの操作はKawanet Tech Blogさんが参考になります。

■2011-04-08追記
DebianのAMI情報を見つけました。
Cloud/AmazonEC2Image – Debian Wiki
ec2debian | Google グループ
Wikiのほうは2011-03-11にページが用意されたようです。