この記事は『CRESCO Advent Calendar 2021』 22日目の記事です。
『CRESCO Advent Calendar 2021』 1日目の記事でAWSをGitLabでホスティングしましたが、
色々手順があって面倒だったので、Terraform化してみました。
(cloud9のUbuntuプラットフォームでの構築は対応されてなかったので、1日目の記事を見て構築してみてください。)
手順は以下です。
1.Terraform実行環境を作成します。
2.Terraformのセットアップをします。
3.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-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-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はどんどんバージョンアップを重ねているので、これからが楽しみです!
最後までお付き合いありがとうございました!!!


