この記事は『CRESCO Advent Calendar 2021』 22日目の記事です。

 

『CRESCO Advent Calendar 2021』 1日目の記事でAWSをGitLabでホスティングしましたが、
色々手順があって面倒だったので、Terraform化してみました。
(cloud9のUbuntuプラットフォームでの構築は対応されてなかったので、1日目の記事を見て構築してみてください。)
手順は以下です。
1.Terraform実行環境を作成します。
2.Terraformのセットアップをします。
3.Terraformでリソースを作成します。

それでは、やってみましょう!

1.Terraform実行環境を作成します。

1-1.Cloud9サービスコンソールから[Create environment]をクリックします。

1-2.NameにCloud9環境の名前を入力して、(今回はterraform-sandboxとしています)[Next step]をクリックします。

1-3.Configure Settingは何も変えずに[Next step]をクリックします。

1-4.内容を確認したら[Create environment]をクリックします。

2.Terraformのセットアップをします。

2-1.ターミナルで、下記コマンドを実行してTerraformのバージョンを確認します。

※Cloud9はデフォルトでTerraformの最新バージョンがインストールされています。

terraform -version

2-2.環境変数として、IAMユーザのアクセスキーとシークレットアクセスキーを登録する。

export TF_VAR_access_key="AKIAXXXXXXXXXXXXXXXXXX"
export TF_VAR_secret_key="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

※IAMのアクセスキーとシークレットアクセスキーは、IAMユーザのサービスコンソールから発行してください。

あと、取扱にはご注意ください。

2-3.Terraformの状態管理をするファイルの保存先としてS3を作成します。S3のサービスコンソールから[バケットを作成]をクリックします。

2-4.バケット名に名前を入力し、(今回はnissy-terraform-bucketとします)AWSリージョンを選択します(今回は東京リージョンとします)。

2-5.バケットのバージョニングは[有効にする]を選択します。

2-6.デフォルトの暗号化は[有効にする]を選択し、暗号化キータイプは[Amazon S3キー]を選択します。

2-7.2-4~2-6までの設定が出来たら、[バケットを作成]をクリックします。

2-8.下記のような緑の画面が出てきたら完了です。

2-9.下記ファイルをCloud9に作成する。

#main.tfファイル
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.67.0"
}
}
backend "s3" {
bucket = "hogehogebucket" # 作成したS3バケット
region = "ap-northeast-1"
key = "terraform.tfstate"
}
}
# Configure the AWS Provider
provider "aws" {
region = "ap-northeast-1"
}

2-10.main.tfファイルのあるディレクトリで下記コマンドを実行する。

terraform init

※[Terraform has been successfully initialized!]のレスポンスがあれば実行成功です。

3.Terraformでリソースを作成します。

3-1.事前に踏み台用のCloud9を作成した上で、下記ファイルを作成しIPアドレスを踏み台用Cloud9のものに書き換えます。

※踏み台用Cloud9の作成方法は『CRESCO Advent Calendar 2021』 1日目の記事を確認してください。

#ec2.tfファイル
resource "aws_instance" "demo" {
ami = "ami-00000000000000000"
instance_type = "t2.large"
tags = {
Name = "hogehoge-instance"
}
}
variable "key_name" {
description = "keypair name"
default = "test-demo-key"
}
# キーファイル
locals {
public_key_file = "./${var.key_name}.id_rsa.pub"
private_key_file = "./${var.key_name}.id_rsa"
}
resource "tls_private_key" "keygen" {
algorithm = "RSA"
rsa_bits = 4096
}
# 秘密鍵ファイルを作る
resource "local_file" "private_key_pem" {
filename = "${local.private_key_file}"
content = "${tls_private_key.keygen.private_key_pem}"
}
resource "local_file" "public_key_openssh" {
filename = "${local.public_key_file}"
content = "${tls_private_key.keygen.public_key_openssh}"
# keyファイルの権限を変更する
provisioner "local-exec" {
command = "chmod 600 ${local.public_key_file}"
}
}
resource "aws_security_group" "demo" {
name = "gitlab-instance"
description = "gitlab-instance"
vpc_id = "vpc-9aa443fc" # デフォルトvpcのID
egress = [
{
cidr_blocks = [
"0.0.0.0/0",
]
description = ""
from_port = 0
ipv6_cidr_blocks = []
prefix_list_ids = []
protocol = "-1"
security_groups = []
self = false
to_port = 0
},
]
ingress = [
{
cidr_blocks = [
"0.0.0.0/0",
]
description = ""
from_port = 80
ipv6_cidr_blocks = [
"::/0",
]
prefix_list_ids = []
protocol = "tcp"
security_groups = []
self = false
to_port = 80
},
{
cidr_blocks = [
"xx.xx.xx.xx/xx",
]
description = ""
from_port = 22
ipv6_cidr_blocks = []
prefix_list_ids = []
protocol = "tcp"
security_groups = []
self = false
to_port = 22
},
]
}
resource "aws_eip" "demo" {
instance = aws_instance.demo.id
vpc = true
tags ={
"Name" = "gitlab-instance-eip"
}
}

秘密鍵ファイルの作成コードはこちらを引用しました。ありがとうございます!!!

3-2.下記コマンドを実行しデプロイするリソースを確認します。

terraform plan

3-3.下記コマンドを実行したら[yes]をタイプしてリソースのデプロイを実行します。

terraform apply

ここまで出来たら、『CRESCO Advent Calendar 2021』 1日目の記事を見ながら踏み台サーバ経由でGitLabインストールを実施してください。なお、.pemファイルはTerraformを実行したCloud9のフォルダに保管されています。

ここまで作ってみると、意外と.pemファイルの作成に悩みました・・・。また、Terraformで対応しきってないリソースなども分かってとても勉強になりました。

とは言え、Terraformはどんどんバージョンアップを重ねているので、これからが楽しみです!

最後までお付き合いありがとうございました!!!