MENU
  • サービス
  • AWS導入支援
  • AWS運用代行
  • WordPress
    • WordPress高速化
    • WordPress脆弱性対策
  • 導入事例
  • 良くあるご質問
  • AWS技術知見
  • お問い合わせ
AWSの導入・クラウド運用を総合支援【CapsuleCloud】
  • サービス
  • AWS導入支援
  • AWS運用代行
  • WordPress
    • WordPress高速化
    • WordPress脆弱性対策
  • 導入事例
  • 良くあるご質問
  • AWS技術知見
  • お問い合わせ
AWSの導入・クラウド運用を総合支援【CapsuleCloud】
  • サービス
  • AWS導入支援
  • AWS運用代行
  • WordPress
    • WordPress高速化
    • WordPress脆弱性対策
  • 導入事例
  • 良くあるご質問
  • AWS技術知見
  • お問い合わせ
  1. ホーム
  2. AWS技術知見
  3. Rancher
  4. RancherにTerraform + AWSでホスト(RancherOS)を自動追加

RancherにTerraform + AWSでホスト(RancherOS)を自動追加

2022 8/18
Rancher
2022年8月18日
目次

はじめに

Rancher環境にAWSのスポットインスタンスでホストを追加したいときってありますよね。
でもスポットインスタンスはいつ消されるかわからない環境なので、単体でRancherのホストとして使っていてもいつかきっと意図しないタイミング消されます。
そんなことが無いように今回はスポットインスタンスをAuto Scaling Groupに関連付け、かつRancher環境に自動でホストとして登録してみましょう。(しかもTerraformで!)

構成

構成としては以下のようになります。
TerraformでAuto Scaling Groupを作成しつつ、User-Dataを使ってRancher Server(今回はtry.rancher.com)に自動登録します。

コードについて

今回使用するコードの完成形はこちらに置いています。
また、このterraform内で使用しているmoduleもこちらに置いています。
これらのコードはほぼほぼgreensheep/terraform-aws-rancher-hostsから作っています。

変更している点としては主に、

  • terraformで自前で作ったrancher-serverがあることを前提にしないようにした
  • ↑の関係でホスト削除の際にSQSでrancher-serverにホスト自動削除依頼がされない
  • ↑の関係でSQSが必要なくなるのでIAMリソースの作成もしない
  • 立ち上げるAMIはRancherOSにしている

ことです。

AWSにTerraformで作るリソース

セキュリティグループ(aws_security_group)

Rancherに追加するホストたちが使用するセキュリティグループを作ります。
IPSecのためにUDPの500と4500を開けておきます。

オートスケールのLaunch Configuration(aws_launch_configuration)

オートスケールに使用するLaunch Configurationを作ります。
主にEC2の情報になります。ポイントとしては、先に作っておいたセキュリティグループのIDを使うようにすることと、スポットインスタンスであればspot_priceで希望する価格を記載することです。
AMIの最新に関してはこちらで確認が可能なので、適宜見ておきましょう。

Auto Scaling Group(aws_autoscaling_group)

オートスケールに使うAuto Scaling Groupです。
ここでどれだけのインスタンス数にするかを決めます。

User Dataを使ったホスト(EC2)のRancherへの自動登録

Terraformのaws_launch_configurationにはuser_dataを渡すことができます。
EC2の初期化時にこれが発火するのですが、RancherOSであればここにcloud-configを渡すことができます。
公式ドキュメントの「Running RancherOS on AWS」にも3番で述べられています(ファイルでも良いしテキスト渡してもいい)。

さて、自動登録するためにやりたいことは以下のとおりです。

  1. rancher-serverの対象EnvironmentからregistrationTokenを取得
  2. EC2のメタ情報を取得(IPアドレスなど)
  3. 登録コマンド発火してrancher-agentを起動

これをやるためにはcurlが欲しくなりますが、残念ながらRancherOSにはcurlがありません。
そこでcurlだけが入ったコンテナ(supersoftware/curl)を使ってコマンド発火させることにしました。
注意点として、これにはコンテナを使うため、dockerが使えないといけません。

cloud-configにはruncmdという場所でスクリプトを実行できるのですが、ここで書くコマンドはdockerが使えるようになる前に実行されますので、この中でdockerを使うと必ず失敗します。
そういうときの為に/etc/rc.localにスクリプトを書いておく手法があります。
これはdockerの起動状態を気にせずに発火するスクリプトなので、ここでwait-for-dockerという特別なコマンドを使うことで、必ずdockerが使える状態を保証することができます。

cloud-configを以下のように記述することで/etc/rc.localを作成することができます。

#cloud-config
write_files:
- path: /etc/rc.local
permissions: "0755"
owner: root
content: |
#!/bin/bash
wait-for-docker
# Setup initial vars
serverUrl=https://${environment_access_key}:${environment_secret_key}@${server_hostname}
projectId=${environment_id}
curlCmd="docker run --rm supersoftware/curl"
# Make initial POST request for a registration token and record the id
response=$($curlCmd -s -X POST $serverUrl/v1/registrationtokens?projectId=$projectId)
requestId=$(echo $response | jq -r '.id')
requestState=$(echo $response | jq -r '.state')
# The registration token request is async so keep checking until it's complete
while [[ "$requestState" != "active" ]]; do
sleep 2
response=$($curlCmd -s $serverUrl/v1/registrationtokens/$requestId)
requestState=$(echo $response | jq -r '.state')
done
# Get the instance id from metadata
instanceId=$($curlCmd -s http://169.254.169.254/latest/meta-data/instance-id)
instancePrivateIp=$($curlCmd -s http://169.254.169.254/latest/meta-data/local-ipv4)
# Labels
instanceLabels="HOSTID=$instanceId&CLOUD=aws&CLUSTER=${cluster_name}"
customLabels="${cluster_instance_labels}"
if [ -n "$customLabels" ]; then
instanceLabels="$instanceLabels&$customLabels"
fi
# Add external DNS label if there's a public IP address
instancePublicIp=$($curlCmd -f -s http://169.254.169.254/latest/meta-data/public-ipv4)
if [ -n "$instancePublicIp" ]; then
instanceLabels="$instanceLabels&io.rancher.host.external_dns_ip=$instancePublicIp"
fi
# Use the command in the response to start the rancher agent
cmd=$(echo $response | jq -r '.command')
# add environment variables when launching the agent
eval $${cmd/sudo docker run /sudo docker run -e CATTLE_AGENT_IP=$instancePrivateIp -e CATTLE_HOST_LABELS=\"$instanceLabels\" }

YAMLに慣れてる人はすぐ気付くと思いますが、公式ドキュメント通りに記述すると…

#cloud-config
rancher:
write_files:
- path: /etc/rc.local
permissions: "0755"
owner: root
content: |
#!/bin/bash
wait-for-docker

このように、write_filesの下の- path:はインデントしています。
これは不正なので、インデントを無くしてください(これのせいでかなり悩まされました…)。

もう一つ、上のデータはTerraformのtemplate(userdata.template)として用意しています。
なので、terraformが埋める変数がそのままの記述(e.g. ${environment_key})になっています。
これはterraform applyする際にrenderedされ、自分で設定した値に置換されるようになっています。

デプロイ!

supersoftware/tf-aws-try-rancher-hostsからterraformのコードcloneし、必要な情報を埋めてterraform plan → terraform applyしてみましょう。
try.rancher.comの指定したEnvironmentにホストが自動で登録されるはずです。

おわりに

Rancherにホストをオートスケールで自動登録する方法についてご紹介しました。
実際はスポットインスタンスが停止するときにRancher Serverに連絡してホストを削除するようにしないと、お亡くなりになったホストがRancher管理下に残り続けます。
そこら辺はオートスケールのライフサイクルフックをうまく駆使し、本番では必ずお掃除を心掛けましょう。

Rancher
autoscale aws Rancher rancheros Terraform

関連記事

  • rancher
    【実践】RancherでArangoDB Vol.1
  • rancher
    Rancherでレジストリのホワイトリストを設定する
  • rancher
    Rancherで構築するDPP(Data Processing Platform)〜環境構築〜
  • terraform
    【実践】Rancher HAをTerraformで構築する
  • rancher
    【実践】Rancherで構築するオンプレとクラウドのハイブリッド環境「後編」
  • rancher
    【実践】Rancherで構築するオンプレとクラウドのハイブリッド環境「前編」
  • rancher
    【実践】Rancherで本番運用するには
  • rancher
    【実践】RancherでBoostOnPremise Vol. 1
検索
clouddx003-low.pdf - 1.8MB
資料ダウンロードはこちら
人気記事
  • terraform
    Terraformと変数(variable)のお話
    Terraform
  • aws-s3
    Amazon S3で署名付きURLを使ったアクセス制御
    AWS技術知見
  • AWS導入支援
    amazonクラウド、AWSとは?何ができるかデメリット含めわかりやすく説明
    AWS導入支援
  • WordPress高速化!6つの簡単な方法で重さを改善
    WordPress
  • ansible
    AWSのためのAnsible入門
    AWS技術知見
  • WordPress脆弱性の原因とやっておくべき7つの対策
    WordPress
  • 【実例20選】AWS導入企業、活用事例をご紹介
    AWS導入支援
新着記事
  • AWS運用代行企業5選!企業選びのポイントを解説
    AWS運用代行
  • AWS運用代行のサービス内容やメリットについて
    AWS運用代行
  • 10分でスタート!AWSの利用開始までを解説
    AWS導入支援
  • WordPress脆弱性の原因とやっておくべき7つの対策
    WordPress
  • WordPress高速化!6つの簡単な方法で重さを改善
    WordPress
カテゴリー
  • AWS導入支援
  • AWS技術知見
    • Rancher
    • Terraform
  • AWS運用代行
  • WordPress
タグ一覧
AI (3) aws (25) aws-cli (3) CloudFormation (1) CloudSearch (3) DeepLearning (1) DNS (2) Docker (4) EBS最適化オプション (1) ec2 (7) ElasticBeanstalk (1) Geo Routing (1) Gitlab (1) HA (1) infrastructure-as-code (1) keypair (1) load-balancer (1) nginx (2) OpenAM (3) Rancher (8) Rekognition (2) Route53 (3) s3 (2) secrets (1) security-group (1) Terraform (6) terragrunt (2) tfvars (1) variable (1) vault (1) VPC (1) wordpress (3) アプリケーション (1) オンプレミス (2) クラウド (2) サインアップ (1) シングルサインオン (3) セキュリティ (1) セキュリティグループ (1) ネットワーク設計 (1) 人工知能 (2) 初心者 (1) 本番運用 (1) 画像認識 (3) 起動 (1)
アーカイブ
  • 2022年9月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2017年7月
  • 2017年6月
AWSエンジニア積極採用!
採用情報
フリーランスの求人情報!
テックブレイン

スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。

スーパーソフトウエアはRancherパートナーネットワークのコンサルティングパートナーです。

logo

カプセルクラウドはAWSクラウドのマネージドサービスです。AWSを安心かつ迅速に導入し、負荷分散・セキュリティ・DevOps・コスト削減など、クラウドサービスのメリットを活かした豊富なベストプラクティスをご提供いたします。

Contents

  • サービス
  • 導入支援
  • WordPress
  • 導入事例
  • ブログ
  • Q&A
  • お問い合せ
  • 資料ダウンロード

お問い合わせ

株式会社スーパーソフトウエア
東京 03-6721-7105
大阪 06-4707-6001
info-capsulecloud@tokyo.supersoftware.co.jp

  • プライバシーポリシー
  • 免責事項
  • 契約約款
  • 特商法に基づく表記
  • 会社情報
  • サイトマップ

© Supersoftware 2017. All rights reserved.

目次