ラベル ec2 の投稿を表示しています。 すべての投稿を表示
ラベル ec2 の投稿を表示しています。 すべての投稿を表示

2013年1月12日土曜日

EC2 のインスタンスで chef-client が UndefinedConversionError

EC2 のインスタンスに chef-client をインストールして使っていたのですが、user-data を設定したインスタンスだけ、chef-client がエラーになってしまいます。

エラーメッセージは以下のようなもの。
FATAL: Encoding::UndefinedConversionError: "\x8B" from ASCII-8BIT to UTF-8

確認してみたところ、json への変換部分でエラーになっている模様。
lib/chef/node.rb

    # Serialize this object as a hash
    def to_json(*a)
      result = {
        "name" => name,
        "chef_environment" => chef_environment,
        'json_class' => self.class.name,
        "automatic" => automatic_attrs,
        "normal" => normal_attrs,
        "chef_type" => "node",
        "default" => default_attrs,
        "override" => override_attrs,
        #Render correctly for run_list items so malformed json does not result
        "run_list" => run_list.run_list.map { |item| item.to_s }
      }
      result["_rev"] = couchdb_rev if couchdb_rev
      result.to_json(*a)
    end
result の中身で "\x8B" が入っているところを探すと、userdata の部分にありました。
{ ... "userdata"=>"\x1F\x8B ... }

どうやら、user-data を作成する際に圧縮をしていたため、userdata にバイナリのデータが入っていたことが原因のようです。

CloudInit のページを参考に、user-data を圧縮していたのですが、16KB のサイズ制限を超えているわけでもないので、圧縮しないことで回避することにしました。

user-data の内容は、Node の Attribute に含まれていて、chef-server で Attribute を表示するためなどの目的で、json へ変換しているのですね。

2012年12月1日土曜日

Amazon Linux で起動時にホスト名を設定する

Amazon Linux で起動時にホスト名を設定したいと思い、調べてみたところ CloudInit というものがあることが分かりました。

CloudInit とは、cloud-platform(EC2 や Openstack など)の Ubuntu でインスタンスの初期化を扱うためのものです。Amazon Linux では、CloudInit が使用可能になっているんですね。

サンプルを参考に、以下の内容をインスタンス起動時に渡してみましたが、うまくいきません。

cloudinit: /doc/examples/cloud-config.txt
$ cat cloud-config.txt
--------------------------------------
#cloud-config
hostname: myhostname
--------------------------------------
$ ec2-run-instances ami-4e6cd34f -g [GROUP] -k [KEYPAIR] -t [INSTANCE_TYPE] -f cloud-config.txt

Ubuntu の AMI を使用すると、うまくホスト名が設定できるので もう少し調べてみたところ、このフォーラムにたどり着きました。

Amazon AMI w/ #cloud-config - struggling with the basics
For your question as to why setting the hostname isn't working, it is because the version of cloud-init found in the Amazon Linux AMI does not currently support those options.

今の Amazon Linux では、hostname のオプションは使えないそう。フォーラムには、別の方法での設定例があって、以下の方法でも実現できるんですね。
#cloud-config
runcmd:
 - [ echo, 'Setting custom hostname' ]
 - [ sed, -i, 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=MyName/g', /etc/sysconfig/network ]
 - [ hostname, 'MyName' ]

2012年6月23日土曜日

Amazon EC2 の AMI の種類

Amazon EC2 の AMI には、EBS-backed と instance store-backed の2種類あります。それぞれの違いについてあらためて整理してみる。

・root device のサイズ制限
EBS-backed は 1TBまで。instance store-backed は 10GBまで。 Windows などは サイズが大きいので、多くは EBS-backed になる。

・停止時の動作の違い
EBS-backed だと停止時の動作に stop を選択できる。stopped のインスタンスは EBS上に保持され、restart することが可能。EBS は永続性のあるストレージのため、restart 後もデータは保持される。

instance store-backed は、terminate のみ。terminate したインスタンスはデータが失われる。また、意図的でない停止(インスタンスの障害など)でも同様にデータが失われる。

すなわち EBS は、EC2のインスタンスとは独立してデータを保持するが、instance store は EC2のインスタンス起動時のみデータが保持される。

・起動にかかる時間
EBS-backed AMI は instance store-backed AMI よりも起動時間が短い。目安としては、EBS-backed で1分以内、instance store-backed で 5分以内。

・AMI の作成方法
instance store-backed の Linux/Unix OS でAMIを作成する場合、インスタンス自身の上でイメージを作成する必要があり、API が用意されていない。EBS-backed であれば ec2-create-image コマンドで作成が可能。

・課金方法
instance store-backed は、AMI ストレージである S3 の料金 と インスタンス使用量 に対して料金がかかる。EBS-backed は AMI ストレージである EBS snapshot の料金(= S3 の料金) と インスタンス使用量に加えて、EBS の 割当量と入出力量 に対して料金がかかる。

また、instance store-backed は、AMI をカスタマイズして新しく作成した際、全体が S3 に保存されるのに対し、EBS-backed では変更部分のみ保存される。そのため、次に保存する AMI のサイズは小さくなり AMI ストレージ の料金は instance store-backed に比べて低くなる。


こうやって見ていると EBS-backed の方が管理しやすいように思えますね。

2012年5月4日金曜日

Amazon Linux の yum リポジトリ

Amazon Linux AMI のインスタンスで Python をソースからコンパイルしたかったのですが、いつもコンパイル時にインストールしていた tk-devel パッケージが見つからない。

Amazon Linux では、amzn-main という独自のリポジトリが設定されている模様。
$ ls /etc/yum.repos.d/
---------------------------------
amzn-nosrc.repo    amzn-updates.repo  epel.repo
amzn-main.repo     amzn-preview.repo  epel-testing.repo
---------------------------------

Amazon Linux に含まれている EPEL リポジトリのバージョンが 6 に設定されていたので、AWSのフォーラムを参考に、CentOS 6 のリポジトリを追加してインストールを試みた。
$ cd /etc/yum.repos.d
$ sudo vim CentOS-Base.repo
--------------------------------------------
[base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
enabled=0
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
--------------------------------------------
$ sudo yum install --enablerepo=base tk-devel

$ rpm -qa | grep tk-devel
tk-devel-8.5.7-5.el6.x86_64

うまくインストールされ、Python のコンパイルも成功。