開発部の「エイジ」です。
今回はterraformを使ってEC2を構築する手順を書きたいと思います。
terraformとは
terraformを使用することのメリット
Terraformインストール
1 2 3 |
# brew install terraform |
Terraformのバージョン確認
1 2 3 |
# terraform version |
AWSの環境構築
今回はAWS(EC2)をするにあたりiamユーザーを作ります。
IAM ユーザーを作る
AWS CLIを使うのでプログラムによるアクセスにも☑️してください。
管理権限をAdministratorAccessにしてください。
無事作成できたら次にAWS CLIをインストールします。
AWS CLI
1 2 3 |
# sudo pip install awscli |
AWS CLIの設定
先ほど制作したiamユーザーの情報を登録します。
1 2 3 |
# aws configure --profile ユーザー名 |
一つづづ先ほど作成したiamユーザーから設定していきます。
1 2 3 4 5 6 7 |
AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [None]: Default output format [None]: json # Asia Pacific (Tokyo) ap-northeast-1 |
Terraformを作成する。
これからEC2作成までを書いていきます。
まずはTerraformのコマンドを記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
## 初期化 Terraformで新しく設定を記述した場合、初期化を行う必要があります。 # terraform init ## 確認(所謂dry-run) # terraform plan ## 適用 コードの状態をAWS上へ適用 # terraform apply ## すべて消去するコマンド # terraform destroy ## リソースの閲覧 # terraform show |
まずはTerraformを書き込むファイルを作成します。
1 2 3 |
touch main.tf |
※Terraformは拡張子が.tfのファイルを自動的にテンプレートとして認識してくれます。
下記のようにまずはプロバイダーとVPCを宣言します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
provider "aws" { profile = "プロフィール名" region = "ap-northeast-1" } # VPC resource "aws_vpc" "this" { cidr_block = "10.1.0.0/16" instance_tenancy = "default" tags = { Name = "tf-example-vpc" } } |
コマンドを実行します。
1 2 3 4 5 |
# terraform init # terraform plan # terraform apply |
実際にAWS上で確かめると作成されています。
このようにAWS上からGUI操作せずにコードを書いてインフラを構築することができます。
1 2 3 |
resource "aws_vpc" |
このように宣言するresourceを指定して様々なものが作成されます。
それではEC2作成まで書き記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
provider "aws" { profile = "プロフィール名" region = "ap-northeast-1" } # VPC作成 resource "aws_vpc" "aws-tf-vpc" { cidr_block = "10.1.0.0/16" instance_tenancy = "default" enable_dns_support = "true" enable_dns_hostnames = "true" tags = { Name = "tf-example-vpc" } } # サブネット2つ作成(publicとprivate) resource "aws_subnet" "aws-tf-public-subnet-1a" { vpc_id = aws_vpc.aws-tf-vpc.id cidr_block = "10.1.1.0/24" availability_zone = "ap-northeast-1a" tags = { Name = "aws-tf-public-subnet-1a" } } resource "aws_subnet" "aws-tf-private-subnet-1a" { vpc_id = aws_vpc.aws-tf-vpc.id cidr_block = "10.1.20.0/24" availability_zone = "ap-northeast-1a" tags = { Name = "aws-tf-private-subnet-1a" } } # インターネットゲートウェイの作成 resource "aws_internet_gateway" "aws-tf-igw" { vpc_id = aws_vpc.aws-tf-vpc.id tags = { Name = "aws-tf-igw" } } # ルートテーブルの作成 resource "aws_route_table" "aws-tf-public-route" { vpc_id = aws_vpc.aws-tf-vpc.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.aws-tf-igw.id } tags = { Name = "aws-tf-public-route" } } # サブネットの関連付けでルートテーブルをパブリックサブネットに紐付け resource "aws_route_table_association" "aws-tf-public-subnet-association" { subnet_id = aws_subnet.aws-tf-public-subnet-1a.id route_table_id = aws_route_table.aws-tf-public-route.id } # EC2作成(public側) resource "aws_instance" "aws-tf-web" { ami = "ami-011facbea5ec0363b" instance_type = "t2.micro" disable_api_termination = false key_name = aws_key_pair.auth.key_name vpc_security_group_ids = [aws_security_group.aws-tf-web.id] subnet_id = aws_subnet.aws-tf-public-subnet-1a.id tags = { Name = "aws-tf-web" } } # Security Group resource "aws_security_group" "aws-tf-web" { name = "aws-tf-web" description = "aws-tf-web_sg" vpc_id = aws_vpc.aws-tf-vpc.id tags = { Name = "aws-tf-web" } } # 80番ポート許可のインバウンドルール resource "aws_security_group_rule" "inbound_http" { type = "ingress" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0", ] # ここでweb_serverセキュリティグループに紐付け security_group_id = aws_security_group.aws-tf-web.id } # 22番ポート許可のインバウンドルール resource "aws_security_group_rule" "inbound_ssh" { type = "ingress" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0", ] # ここでweb_serverセキュリティグループに紐付け security_group_id = aws_security_group.aws-tf-web.id } # アウトバウンドルール resource "aws_security_group_rule" "outbound_all" { type = "egress" from_port = 0 to_port = 0 protocol = -1 cidr_blocks = [ "0.0.0.0/0", ] # ここでweb_serverセキュリティグループに紐付け security_group_id = aws_security_group.aws-tf-web.id } # ElasticIP resource "aws_eip" "aws-tf-eip" { instance = aws_instance.aws-tf-web.id vpc = true } # output "example-public-ip" { # value = "${aws_eip.aws-tf-eip.public_ip}" # } variable "public_key_path" {} resource "aws_key_pair" "auth" { key_name = "terraform-aws" public_key = file(var.public_key_path) } |
インスタンスのkey_nameについて
GUIで作るときはインスタンス作成時にsshキーを新規作成や既存のキーを使いAWSにアクセスしますが、
terraformで作成する場合は.tfvars
ファイルから参照して公開鍵をインスタンスのkey_name
に貼り付けます。
私はterraform-aws
という名前で鍵を作成しました。
1 2 3 4 5 |
# cd .ssh # ssh-keygen -t rsa terraform-aws 今回の場合の名前 |
1 2 3 |
touch terraform.tfvars |
terraform.tfvarsに外部ファイルの参照先を指定します.tfvarsもterraformコマンド実行時に読み込みがされます。
さらに.tfvars
はgithubに挙げないとこが大事です
1 2 3 |
public_key_path = "~/.ssh/terraform-aws.pub" |
これでTerraformコマンドを実行します。
1 2 3 4 |
# terraform plan # terraform apply |
これで無事EC2を作ることができました。
実際にsshログインしてみましょう。
1 2 3 |
# ssh -i ~/.ssh/terraform-aws ec2-user@IPアドレス |
以上になります。お読みいただきありがとうございました。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。