本ガイドではTerraformを使用して演習環境をAWS上に構築する手順を解説します。 環境のイメージは次の通りです。
AWS環境図
本レポジトリのモジュール群は以下のバージョンを前提とします。
| Name | Version |
|---|---|
| terraform | >= 0.15.4 |
| aws | >= 3.53.0, < 4.0.0 |
本節で具体的な使用方法を説明します。
本ガイドではAWS Marketplaceで提供されているCentOS 8 (x86_64) - with Updates HVMを使用します。
そのため、事前にこのOSイメージを環境構築で使用するAWSアカウントにSubscribeする必要があります。
次の手順を実施してください。
- 使用するAWSアカウントのマネージメントコンソールにログインする
- AWS Marketplaceにアクセスする。
- 画面右上の
Contunue to Subscribeを選択する。
You're subscribed to this software. Please see the terms and pricing details below or click the button above to configure your software.
と表示されていれば作業完了です。
まず本レポジトリを任意の場所でクローンします。
なお、以降の手順では任意のディレクトリのパスを環境変数$CLONEDIRとして進めます。
export CLONEDIR=`pwd`
git clone https://github.com/cnc4e/docker-practice.gitdocker-swarmモジュールのディレクトリへ移動します。
cd $CLONEDIR/docker-practice/terraform/environment/docker-swarm環境構築に使用する各種パラメータをdocker-swarm.tfに指定します。
ファイルのコメントを参考に各パラメータを指定してください。
以下に例を記載します。
- region
- pj
- env
- owner
- key_name
provider "aws" {
# 環境を構築するリージョンを指定します。
region = "us-west-1"
}
locals {
# common parameter
## 各リソースの名称やタグ情報に使用するパラメータを指定します。
pj = "docker-practice"
env = "develop"
owner = "user01"
tags = {
pj = local.pj
env = local.env
owner = local.owner
}
# Network
## VPCに割り当てるCIDRを指定します。
vpc_cidr = "10.0.0.0/16"
## subnetに割り当てるCIDRを指定します。
subnet_cidr = "10.0.0.0/24"
# EC2
## 作成するノードの一覧です。リストした名前のEC2を作成します。
nodes = ["manager0", "manager1", "manager2", "worker0", "worker1"]
## 作成するEC2のインスタンスタイプを指定します。
instance_type = "t2.medium"
## EC2に割り当てるキーペアを指定します。あらかじめ作成が必要です。
key_name = "ec2_key_pair"
# SecurityGroup
## 各ノードにインターネット経由でSSH接続する場合に送信元グローバルIPを指定します。
## どこからも許可しない場合は空配列を指定する。
allow_ssh_cidrs = ["119.110.104.16/28"]
## 各ノードにインターネット経由でdocker APIを利用する場合に送信元グローバルIPを指定します。
## どこからも許可しない場合は空配列を指定する。
allow_docker_api_cidrs = ["119.110.104.16/28"]
# ClowdWatch
## 作成するEC2に自動起動/自動停止のスケジュールを設定します。
auto_start = true # trueにするとEC2の自動起動をスケジュール設定します。
auto_start_schedule = "cron(00 0 ? * MON-FRI *)" # 日本時間で平日09:00の指定
auto_stop = true # trueにするとEC2の自動停止をスケジュール設定します。
auto_stop_schedule = "cron(00 10 ? * MON-FRI *)" # 日本時間で平日19:00の指定
}以下のコマンドでリソースを作成します。
terraform init
terraform apply
> yesこれでSwarmクラスタの構築に必要なMnagerノード、Workerノードが作成されます。 演習に必要なコンポーネント(docker、docker-composeなど)のインストールは完了していますが、 Swarmクラスタ自体はまだ構築されていません。 Swarm初級-Swarmクラスタの構築へ移動し、Swarmクラスタを実際に作成してみましょう。
Swarm中級-ボリュームで使用する Amazon EFSおよび周辺設定を作成します。 こちらの章を実施しない場合、efsモジュールの実行は不要です。
まずefsモジュールのディレクトリへ移動します。
cd $CLONEDIR/docker-practice/terraform/environment/efs環境構築に使用する各種パラメータをefs.tfに指定します。
コメントを参考に各パラメータを指定してください。
以下に例を記載します。
provider "aws" {
# 環境を構築するリージョンを指定します。
region = "us-west-1"
}
<中略>
locals {
# common parameter
## 各リソースの名称やタグ情報に使用するパラメータを指定します。
pj = "docker-practice"
env = "develop"
owner = "user01"
tags = {
pj = local.pj
env = local.env
owner = local.owner
}
}- region
- pj
- env
- owner
以下のコマンドでリソースを作成します。
terraform init
terraform apply
> yesこれでEFSボリュームが作成されます。 Swarm中級-ボリュームへ移動し、 コンテナへのボリュームマウントを実際に試してみましょう。
この環境構築用Terraformで作成した各ノードへの操作方法は次の3つがあります。 それぞれの操作方法について本節で補足します。
- インターネット経由でSSH接続し、各ノード上で操作する
- AWS Session Managerを使用してコンソール接続し、WEBブラウザやAWS CLIなどで操作する
- インターネット経由でdocker APIを使用し、各ノードをリモートで操作する
docker-swarm.tfにおいて次のパラメータを指定することで、
指定した送信元グローバルIPから各ノードにSSH接続することが可能です。
ログインIDはcentosです。認証は公開鍵暗号方式となりますので、
key_nameに指定したキーペアの秘密鍵を使用してください。
(該当箇所抜粋)
## EC2に割り当てるキーペアを指定します。あらかじめ作成が必要です。
key_name = "key_pair_name"
# SecurityGroup
## 各ノードにインターネット経由でSSH接続する場合に送信元グローバルIPを指定します。
## どこからも許可しない場合は空配列を指定する。
allow_ssh_cidrs = ["119.110.104.16/28"] 各ノードにはAWS Session Managerを使用してコンソール接続することが可能です。
Session Managerを使用するために必要なssm agentのインストールにはuser dataを使用しています。 そのためEC2の作成・起動が完了してから、Session Managerが利用可能になるまで、 10~15分程度の時間が必要なりますのでご注意ください。
Session Managerでの操作方法にはいくつか種類があります。 各々の具体的な使用方法は以下のAWS公式ドキュメントを参照してください。
- GUI(WEBブラウザ)を使用する場合
- CLI(AWS CLIや、SSHコマンドなど)を使用する場合
dockerではAPIを外部に公開することでリモートからdockerを操作することが可能です。
API接続にはtcp 2375(暗号化なし)、もしくはtcp 2376(暗号化あり)を使用します。
docker-swarm.tfにおいて次のパラメータを指定することで、
指定した送信元グローバルIPからインターネット経由でdocker APIを使用することが可能になります。
インターネット経由での操作となりますので、tcp 2376のみ許可されます。
## 各ノードにインターネット経由でdocker APIを利用する場合に送信元グローバルIPを指定します。
## どこからも許可しない場合は空配列を指定する。
allow_docker_api_cidrs = ["119.110.104.16/28"]docke APIの具体的な使用方法はこちらを参照してください。