見出し画像

【108】【AWS】【Terraform】【Docker】docker勉強用の環境を構築する

この記事はTerraformを使ってdocker勉強用のAWS環境を構築する記事です。

この本ではdockerの勉強ためにAWSの環境を使っておこないます。
コンソール上でAWSの環境構築について書かれています。
コンソールではなく、terraformを使ってdocker勉強のAWS環境を構築しましょう。

baseのコード

baseのコードはこの記事です。

ちょっと書き換えるだけで構築できます。
terraformめちゃくちゃ便利ですよね。

変更点1(ストレージサイズの変更)

ストレージの変更
dockerを使う際、ストレージは既定の8GBでは少ないので20GBにしています。

変更2(セキュリティグループの変更)

ingressルールの追加
HTTPやHTTPS通信を可能にします。
主要なポート番号下記の通りです。

TCP 20 : FTP (データ)
TCP 21 : FTP (制御)
TCP 22 : SSH
TCP 23 : Telnet
TCP 25 : SMTP
UDP 53 : DNS
UDP 67 : DHCP(サーバ)
UDP 68 : DHCP(クライアント)
TCP 80 : HTTP
TCP 110 : POP3
UDP 123 : NTP
TCP 443 : HTTPS
WELL KNOWN PORT NUMBERS 0~1023
resource "aws_security_group" "docker_ubuntu" {
name = "docker_ubuntu"
vpc_id = aws_vpc.docker_ubuntu.id
egress {
 from_port = 0
 protocol = "-1"
 to_port = 0
 cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group_rule" "ssh" {
from_port = 22
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 22
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "HTTP" {
from_port = 80
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 80
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "HTTPS" {
from_port = 443
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 443
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "web_testing" {
from_port = 8080
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 8082
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "Kubernetes_testing" {
from_port = 30000
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 30000
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}

HTTP、HTTPS通信を行うようにしました。
8080-8082はポート80に似ているという点で実験用でよく使われるポート番号です。
30000ポートはKubernetesの勉強で使います。
Kubernetes NodePortが30000~32767だからです。

コード全文です。

main.tf

terraform {
required_providers {
 aws = {
  source  = "hashicorp/aws"
  version = "~> 3.27"
 }
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region  = "ap-northeast-1"
}
resource "aws_instance" "app_server" {
// このamiはUbuntuです
ami           = "ami-0df99b3a8349462c6"
// ami = "ami-02892a4ea9bfa2192"
instance_type = "t3.micro"
key_name      = aws_key_pair.auth.id
associate_public_ip_address = true
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.docker_ubuntu.id]
 root_block_device {
 volume_size = 20
}

tags = {
 Name = "ExampleAppServerInstance"
}
}
resource "aws_key_pair" "auth" {
key_name   = var.key_name
public_key = var.public_key
}

resource "aws_security_group" "docker_ubuntu" {
name = "docker_ubuntu"
vpc_id = aws_vpc.docker_ubuntu.id
egress {
 from_port = 0
 protocol = "-1"
 to_port = 0
 cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group_rule" "ssh" {
from_port = 22
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 22
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "HTTP" {
from_port = 80
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 80
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "HTTPS" {
from_port = 443
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 443
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "web_testing" {
from_port = 8080
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 8082
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}
resource "aws_security_group_rule" "Kubernetes_testing" {
from_port = 30000
protocol = "tcp"
security_group_id = aws_security_group.docker_ubuntu.id
to_port = 30000
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
}

route_table_public.tf

resource "aws_route_table" "public" {
 vpc_id = aws_vpc.docker_ubuntu.id
 tags = {
   Name = "docker_ubuntu_route_table_public"
 }
}
resource "aws_internet_gateway" "docker_ubuntu" {
 vpc_id = aws_vpc.docker_ubuntu.id
 tags = {
   Name = "terraform_igw_docker_ubuntu"
 }
}
//ルート
//0.0.0.0/0にigwをつなぐ
resource "aws_route" "public" {
 route_table_id = aws_route_table.public.id
 gateway_id = aws_internet_gateway.docker_ubuntu.id
 destination_cidr_block = "0.0.0.0/0"
}
//サブネットの関連付け
resource "aws_route_table_association" "public" {
 route_table_id = aws_route_table.public.id
 subnet_id = aws_subnet.public.id
}
//サブネット
resource "aws_subnet" "public" {
 cidr_block = "10.0.1.0/24"
 vpc_id = aws_vpc.docker_ubuntu.id
 //  このサブネットで起動したインスタンスに自動的に
 //  IPアドレスを割り当ててくれる
 map_public_ip_on_launch = true
 availability_zone = "ap-northeast-1a"
 tags = {
   Name = "docker_ubuntu_subnet_public_basic_1a"
 }
}

variable.tf

variable "key_name" {
 description = <<DESCRIPTION
your_key.pubを入力してください。
.pubがつく公開鍵の方です。
秘密鍵と間違えないように。
DESCRIPTION
}
variable "public_key" {
 description = <<DESCRIPTION
cat ~/.ssh/your_key.pub
で出力された値を直打ちして下さい。
(パス名のみだと、私の環境ではエラーがでました。)
DESCRIPTION
}

vpc.tf

resource "aws_vpc" "docker_ubuntu" {
 cidr_block = "10.0.0.0/16"
//  DNSサーバーによる名前解決を有効にする
 enable_dns_support = true
//  パブリックDNSホスト名を自動的に割り当てる
 enable_dns_hostnames = true
 tags = {
   Name = "docker_ubuntu"
 }
}

接続する前にキーペアの作成と設定をしましょう。

EC2に接続

接続についてはこの記事で。

amiでubuntuを使っているのでデフォルトユーザー名はubuntuになります。

Dockerをインストールする

接続が完了したらdockerをインストールしましょう。
ubuntuのインストールは下記公式記事を参考にしてください。

https://docs.docker.com/engine/install/ubuntu/

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
   ca-certificates \
   curl \
   gnupg \
   lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

本来これで使えるようになりますが使えませんでした。。。

sudo apt  install docker.io

とすると、使えるようになりました。

さぁ、Dockerの勉強をがんがんやっていきましょう!

参考文献

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing)) オンデマンド (ペーパーバック) 

最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)

現在、株式会社grabssに行くために最後の悪あがきをしています!!

過去の活動

30日間でブログ記事を100件投稿しました。
トータルの投稿数
この記事は108件目の投稿です。

よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。




この記事が気に入ったらサポートをしてみませんか?