これは何かというと
Eucalyptus Advent Calendar 2012 JPのエントリ(12/07)です。季節物(?)ということで、若干、おふざけ感のある内容については、ご容赦ください。
話のネタは、「Aeolous ConductorでAWSとEucalyptusを一緒に管理してどうだすごいだろう」的なデモを作ろうとがんばった際に、やむにやまれず読んだソースコードの思い出です。
Aeolous Conductorについては、こちらを参照ください。できあがったデモは、こちらです。
発端は・・・
もうなんだったか忘れたのですが、Aeolus ConductorがAWSは対応しているけど、Eucalyptusには対応してないと聞いて、「AWS互換のEucalyptusだったら、設定をちょこっと変えれば使えるはず〜」と思ってやりはじめた青春の思い出。
ただ、実際にやりはじめると、ソースの中に、(意外と|想像どおり)AWS決め打ちのハードコーディングがあって、あちこち書き換える必要がありました。結局、アドホックな修正だらけになったので、パッチの公開はあきらめましたが、趣深い部分をいくつかピックアップして紹介してみます。
じつは互換じゃない?
まずこちら。
self.log.debug("Executing register command: %s with environment %s " % (register_command_log, repr(register_env))) register_output = subprocess_check_output(register_command, env=register_env) self.log.debug("Register command output: %s " % (str(register_output))) - m = re.match(".*(ami-[a-fA-F0-9]+)", register_output[0]) + m = re.match(".*([ae]mi-[a-fA-F0-9]+)", register_output[0]) ami_id = m.group(1) self.log.debug("Extracted AMI ID: %s " % (ami_id))
Eucalyptusユーザのあなたはもうお気づきのはずですが、Eucalyptusでは、AMIはAMIではなく、EMIなんですね。
「世界で1つのCLC」!
つづいてこちら。
register_url = "http://ec2.%s.amazonaws.com/" % (region_conf['host']) + if region == "euca-jp-east-1": + upload_url = "http://clc01:8773/services/Walrus" + register_url = "http://clc01:8773/services/Eucalyptus" + bucket= "imagefactory-" + region + "-" + self.ec2_user_id
「ec2.%s.amazonaws.com」--- はい。AWSのURL決め打ち攻撃ですね。まけずと、自分で作ったCLCのregion/hostname決め打ちのパッチを書きました。この時点で、パッチの公開はあきらめました。設定パラメータにして外だしにする気合はでませんでした orz
もうひとつ似たようなのが、こちら。
- conn = S3Connection(self.ec2_access_key, self.ec2_secret_key) + if region == "euca-jp-east-1": + conn = boto.connect_walrus( "clc01", + aws_access_key_id=self.ec2_access_key, + aws_secret_access_key=self.ec2_secret_key ) + ec2_service_cert = "/etc/pki/imagefactory/cloud-cert.pem" + else: + conn = S3Connection(self.ec2_access_key, self.ec2_secret_key) + ec2_service_cert = "/etc/pki/imagefactory/cert-ec2.pem" +
ポイントは、「/etc/pki/imagefactory/cert-ec2.pem」。これは、EC2公式のX.509公開証明書です。決め打ちですね。AWSは世界で1つですからね。まけずと、自分で作った「世界で1つのCLC」の証明書を決め打ちにしておきました。あと、botoのバージョン依存かなにかで(すいません。詳細は忘れました)、S3とWalrusで、接続メソッドを分ける必要がありました。
Euca2ools最高!
最後はこちら。これは、Eucalyptus対応とは関係ないですが、偶然みつけたバグの修正。
bundle_command = [ "euca-bundle-image", "-i", input_image, - "--kernel", aki, "-d", bundle_destination, + "--kernel", aki, "--ramdisk", ari, "-d", bundle_destination, "-a", self.ec2_access_key, "-s", self.ec2_secret_key, "-c", self.ec2_cert_file, "-k", self.ec2_key_file, "-u", self.ec2_user_id, "-r", self.tdlobj.arch,
イメージをS3/WalrusにアップロードするのにEuca2oolsを使っているのですが、呼び出すEuca2oolsのバージョンが上がると、なぜか、euca-bundle-imageに「--ramdisk」オプションが必須になっていたというオチです。外部コマンドの呼び出しは危険がいっぱいですね。
Eucalyptusには対応していないのに、AWSのツールではなくて、Euca2oolsを使うあたりが趣深いです。
今日は、12月7日金曜日。クリスマスまであと18日ですね。