CoreOSをAmazon EC2上で動かす方法
基本的には公式サイトの記述の通りやればOKです。
ご丁寧にCloudFormationのテンプレートまで用意されているのでそれを使えば、セキュリティグループやAutoScalingの設定も含めてやってくれます。(ソースはこちらを参照)
ただ、いくつか修正した方がよい箇所がありますが、それについては後述します。
とりあえずただ起動してみたい、という場合は、以下の手順通りでOKです。
起動する!!
上では色々書いてますが、まずは早速このテンプレートを使って起動しましょう。CoreOSのWebサイトでLaunch Stack
ボタンをクリックすると、以下のようにマネジメントコンソールが起動されます(ログイン画面が間にはいることもあります)。
既に利用するCloudFormationのテンプレートはURLの箇所に指定済なので、Next
ボタンをクリックします。すると以下のような画面が表示されます。
図のようにいくつかのパラメータが聞かれます。それぞれの役割は以下の通りなので適宜入力してください。
- AdvertisedIPAddress etcdの設定に使います。通常はprivateでOK
- AllowSSHFrom SSH接続を許可するアドレスをCIDR形式で記入する。Public Subnetに配置するのであれば0.0.0.0/0は避けること
- ClusterSize 立ち上げるインスタンスの台数
- DiscoveryURL etcdのdiscovery用のエンドポイント。自分で用意しても良いし、https://discovery.etcd.io/new を使っても良い。公開サービスを使う場合はトークンの扱いに気をつけるとともに、アウトバウンドでエンドポイントに繋がるようになっているのを確認すること
- InstanceType 利用するインスタンスタイプ。好きなものを記入
- KeyPair インスタンスに接続する際に利用するキーペア。これがないとインスタンスにログインできない
終わったら、ページ下部のNext
をクリックします。次のような画面が表示されます。
ここでは追加のタグの設定やSNSトピックの設定などができるのですが、割愛してNext
をクリックし、先に進みましょう。
確認画面が表示されます。入力内容に間違いがないことを確認してください。
問題なければページ下部のCreate
をクリックします。CloudFormationのイベントログのページに移動しますので、CREATE_COMPLETE
という表示がされるまで、寿司でも食べながら待ってください。3カンくらいは食べれます。
インスタンスへのログイン
インスタンスへのログインは、普通に、ssh -i 秘密鍵のパス core@IPアドレス
でOKです。
ログインしていつものようにマシンの一覧を表示してみましょう(なお、4001番ポートはCloudFormationのテンプレートを見れば分かる通り外部には公開されていないので、自分の端末からは繋がりません)。
core@ip-172-31-24-49 ~ $ fleetctl list-machines
MACHINE IP METADATA
32ecb0ef... 172.31.24.48 -
5c76e4c4... 172.31.24.49 -
bfd08b19... 172.31.10.102 -
次にユニットの確認。当然ながら何も登録されてないですね。
core@ip-172-31-24-49 ~ $ fleetctl list-units
UNIT MACHINE ACTIVE SUB
ということで、試しに以下のようなUnitファイル([email protected])を用意します。これはapacheを動かしているだけのものです。
[Unit]
Description=Apache Frontend
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill apache%i
ExecStartPre=-/usr/bin/docker rm apache%i
ExecStartPre=/usr/bin/docker pull coreos/apache
ExecStart=/usr/bin/docker run -rm --name apache%i -p 80:80 coreos/apache /usr/sbin/apache2ctl -D FOREGROUND
ExecStop=/usr/bin/docker stop apache%i
[X-Fleet]
Conflicts=web@*.service
で登録します。
fleetctl submit [email protected]
では、起動しましょう。
fleetctl start web@{1,2,3}.service
結果、以下のように表示されればOKです。
Unit [email protected] launched on bfd08b19.../172.31.10.102
Unit [email protected] launched on 32ecb0ef.../172.31.24.48
Unit [email protected] launched on 5c76e4c4.../172.31.24.49
とりあえず動作を確認したい場合は、一端インスタンスのセキュリティグループで80/tcpを通すようにすればOKですが、きちんとやるのであれば、ELBを使います。
ただ、ELBに手で登録したり外したりしてたのでは何やっているのか全く分からないので、ここも自動化しましょう。
ELBへの自動登録・解除
まず、先ほど起動したクラスタと同じリージョン(かつ同じVPC)にElastic Load Balancingを1つ起動します(今回はcoreelbという名前にしました)。さらにCloudFormationで作られたセキュリティグループで、このELBからインスタンスへのアクセスが可能になるようにルールを追加してください。
次に、先ほど起動したapacheを死活監視して、ELBに登録したり、追加したりするためのユニットを追加します。
ファイル名は、[email protected]
として、中身は以下のようにします。
[Unit]
Description=apache presence service
BindsTo=web@%i.service
[Service]
ExecStartPre=-/usr/bin/docker kill apache-presence-%i
ExecStartPre=-/usr/bin/docker rm apache-presence-%i
ExecStart=/usr/bin/docker run --rm --name apache-presence-%i -e AWS_ACCESS_KEY=[自分のAWSアクセスキー] -e AWS_SECRET_KEY=[自分のシークレットキー] -e AWS_REGION=ap-northeast-1 -e ELB_NAME=[設定するELB] quay.io/coreos/elb-presence
ExecStop=/usr/bin/docker stop apache-presence-%i
[X-Fleet]
MachineOf=web@%i.service
出来たらUnitを追加して起動します。
fleetctl submit [email protected]
fleetctl start presence@{1,2,3}.service
現時点では以下のようになっているはずです。
core@ip-172-31-24-49 ~ $ fleetctl list-units
UNIT MACHINE ACTIVE SUB
[email protected] bfd08b19.../172.31.10.102 active running
[email protected] 32ecb0ef.../172.31.24.48 active running
[email protected] 5c76e4c4.../172.31.24.49 active running
[email protected] bfd08b19.../172.31.10.102 active running
[email protected] 32ecb0ef.../172.31.24.48 active running
[email protected] 5c76e4c4.../172.31.24.49 active running
これでしばらく待っているとELBにインスタンスが追加されると思います(インスタンス側のセキュリティグループがELBからの接続を受け付けられるようにしておいてください)。
あとは、もう好きにUnitを更新するなり、自分でDockerのイメージを作って自由に遊ぶなりなんなりどうぞ。Serviceを落とせば自動でELBから外され、Serviceをスタートすると自動でELBにすぐ追加されるのがわかると思います([email protected]と[email protected]が連動して動きます)。
アクセスキーとシークレットキーの取り扱い
上でELBの設定を弄くるために、アクセスキーとシークレットキーをベタで書いてますが、これはマズイやり方です。AWSの場合、EC2からAPIを呼び出したい場合は、インスタンスにIAM Roleを設定します。これはご存じの通り、一度起動したインスタンスには設定できず、起動時に設定することになります。
大本のCloudFormationのテンプレートがそうなってしまっているからなので、いっそのことテンプレートを修正しておくとよいかと思います。
CloudFormationのテンプレートの修正
ということでテンプレートを修正します。主な修正点は、
- 死活監視用のUnitではbotoでAWSのAPIを呼んでいるので、アクセスキーとシークレットキーの埋め込みを避けるために、IAM RoleもCloudFormationの中で作る
- 元々のテンプレートでは起動するVPCやサブネットを指定できないので、自分で好きなところに起動できるようにする
- ついでにELBも作る
スクリプトはこちら
最後に
ECS使え!!って話もありますね。。
Author And Source
この問題について(CoreOSをAmazon EC2上で動かす方法), 我々は、より多くの情報をここで見つけました https://qiita.com/ryuzee/items/1a95e12401a7b11a6346著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .