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

めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Aeolus Conductorで「ぷた☆すー」管理

これは何かというと

 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日ですね。