AWS CloudFormation を使って Solr4 を動かしてみます。 こちらの記事をテンプレート化したものです。
- Amazon EC2 で Solr 4 を動かす (2013年4月17日)
初期設定などをテンプレートにまとめることで、素早く環境を構築できるとともにオペレーションミスを予防できます。Cloud Design Pattern の Stack Deploymentパターンに分類されるそうです。 devopscloud.com の "Lesson 5 - Infrastructure Automation" が順を追った説明になっていると思います。
とりあえず動かす
CloudFormation は JSON でテンプレートを定義します。 ユーザーガイドを読んで理解できれば良いのでしょうが、非常にボリュームが多いので何から始めるべきかに悩むと思います。 そこで、サンプルテンプレートから目的とするものを探し、ユーザーガイドを逆引きするのが良さそうです。
- AWS CloudFormation User Guide (英語しか提供されていません)
- AWS CloudFormation サンプルテンプレート
色々と試行錯誤してみた結果、下記の内容で Solr 4 が動くようになりました。 Apache 2.4, Tomcat 7, Solr 4 をインストールしてくれます。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters" : {
"KeyName" : {
"Description" : "Name of an existing EC2 KeyPair to enable SSH access to the web server",
"Type" : "String"
}
},
"Mappings" : {
"RegionMap" : {
"us-east-1" : {"32" : "ami-5675ee3f", "64" : "ami-3275ee5b"},
"us-west-1" : {"32" : "ami-d8d1fc9d", "64" : "ami-66d1fc23"},
"us-west-2" : {"32" : "ami-d0be2ae0", "64" : "ami-ecbe2adc"},
"eu-west-1" : {"32" : "ami-6893991c", "64" : "ami-44939930"},
"ap-southeast-1" : {"32" : "ami-a29ed2f0", "64" : "ami-aa9ed2f8"},
"ap-southeast-2" : {"32" : "ami-383eaf02", "64" : "ami-363eaf0c"},
"ap-northeast-1" : {"32" : "ami-0f3fbf0e", "64" : "ami-173fbf16"},
"sa-east-1" : {"32" : "ami-a56bb0b8", "64" : "ami-dd6bb0c0"}
}
},
"Resources": {
"SSHGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable SSH access via port 22",
"SecurityGroupIngress": [{
"IpProtocol" : "tcp",
"CidrIp" : "0.0.0.0/0",
"FromPort" : "22", "ToPort" : "22"
}]
}
},
"WebGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable HTTP access via port 80",
"SecurityGroupIngress": [{
"IpProtocol" : "tcp",
"CidrIp" : "0.0.0.0/0",
"FromPort" : "80", "ToPort" : "80"
}]
}
},
"CfnUser" : {
"Type" : "AWS::IAM::User",
"Properties" : {
"Path": "/",
"Policies": [{
"PolicyName": "root",
"PolicyDocument": { "Statement":[{
"Effect":"Allow",
"Action":"cloudformation:DescribeStackResource",
"Resource":"*"
}]}
}]
}
},
"HostKeys" : {
"Type" : "AWS::IAM::AccessKey",
"Properties" : {
"UserName" : {"Ref": "CfnUser"}
}
},
"WebServer" : {
"Type" : "AWS::EC2::Instance",
"Metadata" : {
"AWS::CloudFormation::Init" : {
"config" : {
"packages" : {
"yum" : {
"httpd24" : [],
"tomcat7" : [],
"git-all" : [],
"java-1.7.0-openjdk" : []
}
},
"services" : {
"sysvinit" : {
"httpd" : {
"enabled" : "true",
"ensureRunning" : "true"
},
"tomcat7" : {
"enabled" : "true",
"ensureRunning" : "true"
}
}
},
"sources" : {
"/opt/solr" : "http://ftp.jaist.ac.jp/pub/apache/lucene/solr/4.2.1/solr-4.2.1.tgz"
}
}
}
},
"Properties" : {
"ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "64" ]},
"KeyName" : { "Ref" : "KeyName" },
"InstanceType" : "t1.micro",
"SecurityGroupIds" : [
{ "Ref" : "SSHGroup" },
{ "Ref" : "WebGroup" }
],
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -v\n",
"date > /home/ec2-user/starttime\n",
"yum update -y\n",
"yum update -y aws-cfn-bootstrap\n",
"# Install LAMP packages\n",
"/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackName" }, " -r WebServer ",
" --access-key ", { "Ref" : "HostKeys" },
" --secret-key ", {"Fn::GetAtt": ["HostKeys", "SecretAccessKey"]},
" --region ", { "Ref" : "AWS::Region" }, " || error_exit 'Failed to run cfn-init'\n",
"cat <<EOF >/etc/httpd/conf.d/proxy.conf\n",
"ProxyRequests Off\n",
"ProxyPass /solr4 http://localhost:8080/solr4\n",
"ProxyPassReverse /solr4 http://localhost:8080/solr4\n",
"<Location \"/solr*\">\n",
" Order allow,deny\n",
" Allow from all\n",
"</Location>\n",
"EOF\n",
"cat <<EOF >/usr/share/tomcat7/conf/Catalina/localhost/solr4.xml\n",
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n",
"<Context docBase=\"/usr/local/solr4/solr.war\" debug=\"0\" crossContext=\"true\">\n",
" <Environment name=\"solr/home\" type=\"java.lang.String\" value=\"/usr/local/solr4\" override=\"true\"/>\n",
"</Context>\n",
"EOF\n",
"cp -r /opt/solr/solr-4.2.1/example/multicore /usr/local/solr4\n",
"cp /opt/solr/solr-4.2.1/dist/solr-4.2.1.war /usr/local/solr4/solr.war\n",
"chown -R tomcat:tomcat /usr/local/solr4\n",
"service httpd reload\n",
"service tomcat7 restart\n"
]]}}
}
},
"WebServerEip": {
"Type": "AWS::EC2::EIP",
"Properties": {
"InstanceId": { "Ref": "WebServer" }
}
}
},
"Outputs" : {
"WebsiteURL" : {
"Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServer", "PublicDnsName" ]}]] },
"Description" : "Apache front page"
},
"SolrURL" : {
"Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServer", "PublicDnsName" ]}, "/solr4"]] },
"Description" : "Solr Admin"
},
"WebServerAvailabilityZone" : {
"Value" : { "Fn::GetAtt" : [ "WebServer", "AvailabilityZone" ]},
"Description" : "AvailabilityZone of WebServer"
},
"SSHToWebServer" : {
"Value" : { "Fn::Join" :["", [
"ssh -i $HOME/.ssh/", { "Ref" : "KeyName" }, ".pem",
" ec2-user@", { "Ref" : "WebServerEip" }
]] },
"Description" : "SSH command to connect WebServer"
}
}
}
EDIT: gist を埋め込んでいましたが、更新していくのでテキスト貼付けに変更しました。
スタックを作成するときは "I acknowledge that this this template may create IAM resources" というチェックをオンにします。 インスタンスのメタデータを読み取る権限 ("cloudformation:DescribeStackResource") を追加するためです。
マネージメントコンソールから作業を実施すると、以下のようになります。 必要ならばタグ設定もできるようです。
|
|
|
インスタンスが起動すると、"Outputs" タブに IP アドレスなどが表示されます。
CloudFormation のテンプレートファイル
CloudFormation は宣言的にコンポーネントを記述していきます。 上記のテンプレートではざっくりと5つのものがあります。
- AWSTemplateFormatVersion: フォーマットのバージョンを表す文字列で "2010-09-09" 固定です。
- Parameters: ウィザードで与えるパラメーターを宣言します。
- Mappings: 環境や入力に応じて可変にできるようなマッピングデータを宣言します。
- Resources: AWS で利用するリソースを宣言します。
- Outputs: インスタンス起動時に出力される情報を宣言します。
マッピングデータの例としては、 AMI イメージがあります。 こちらのページで ID を調べて、新しいものに更新しておきましょう。
設定の肝になるのは Resources の組み合わせです。 特に、最もよく使われそうなのが UserData で、インスタンス起動時に任意のスクリプトを実行できます。 CloudFormation の場合は cfn-init というスクリプトを使い、 インスタンスのメタデータから必要なパッケージ情報を読み取って設定できます。 Ref を使うことで、入力パラメータや実行時の情報を参照できます。 ユーティリティ群は Fn としてまとめられています。 属性を読み取る場合は "Fn::GetAtt"、文字列を連結する場合は "Fn::Join" を使います。
メタデータには "AWS::CloudFormation::Init" を指定できます。
利用パッケージ、デーモンなどのサービス設定だけでなく、任意のファイルを取得することも可能です。 S3 を参照することもできますし、Github など任意の URL にアクセスすることも可能です。 また、ZIP や Tar のようなアーカイブファイルの場合は、ダウンロード後に自動で展開してくれます。 上記のテンプレートファイルでは、この機能 (sources) を利用して Solr のアーカイブを取得しています。 コアの設定を HTTP アクセス可能な場所に置くことで、独自のスキーマ定義で Solr を起動できます。
終わりに
AWS CloudFormation を使って Solr4 を動かしてみました。 掲載例では1つのインスタンスしか扱っていませんが、 LAMP 構成で Web と DB を分離したい場合や、ロードバランサーを導入したい場合、 もしくは管理の都合で SSH アクセスを制限したい場合など、もっときめ細かく設定できますので、 様々なテンプレートに目を通してみると良さそうですね。
CloudFormation は単なるテンプレートですが、 システム運用を考えると Chef などの導入も有用になってくると考えられます。 AWS CloudFormation サンプルテンプレート の「白書のテンプレート」では Chef Solo、Chef Server、Chef Client、Puppet を使う場合が紹介されています。 ステップバイステップの説明としては、CloudFormation を使って Chef Solo をインストールする記事が分かりやすいと思いました。





0 件のコメント:
コメントを投稿