AWSサーバレスでTerraformビルド

## Terraformとは?
Terraformはオープンソースであり、HashiCorpによってGo言語で開発されました。具体的にはTerraformではインフラの構成をコードで宣言します。構造化された構成ファイルでは、手動で操作することなくインフラ構成を自動で管理できます。インフラの初期プロビジョニング、更新、破棄、いずれもTerraformではコードにより宣言し、実行します。

AWS の Terraform モジュールは、AWS 統合と自動化ネームスペースページの Terraform レジストリで入手できます。提供されているリンクを使用して、Terraform レジストリのモジュールや GitHub のソースコードにアクセスします。

## Terraformビルド順番

①IAMアカウント作成
➁CLIユーザー作成
③Terraformインストール
④DynamoDBとS3作成
⑤Terraform展開

### ①IAMアカウントを作成する
AWSへログインしてIAM serviceにアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/8dcbd07c-e57f-9e7f-04b0-b8cf3bf3b49e.png)

### ➁CLIユーザー作成
アクセスタイプはProgramatic accessをチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/f6dbdca0-9ca2-9e4c-34b7-fbf393e8c812.png)

CLIユーザー作成後権限グループを作成してアクセス権限へ付与する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/ed5b467a-8f31-9d87-b943-ce46b2d3337f.png)

Showボタンを押下でAccess key IDとSecret access key ーを取得して、アップデートを行います。

ここまでIAMアカウントとcliユーザーの作成が完了しました。これからTerraformビルドを紹介したいと思います。

AWSでCLIをインストールする
https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

ローカル環境により適切なOSバージョンを選択の上、インストールを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/8589c3a6-6205-e4a2-69ad-a19442f12112.png)

CLIインストールが完了したらterminalを開き、「aws configure」コマンドを実行する。					
$ aws configure
AWS Access Key ID [None]: [Access Key ID]
AWS Secret Access Key [None]: [Secret Access Key]
Default region name [None]: ap-xxxxx-1
Default output format [None]: json

### ③Terraformインストール

まずは下記のリンクにてTerraformをインストールする
https://learn.hashicorp.com/tutorials/terraform/install-cli

インストールが完了したら下記のコマンドを実行する
 terraform -v

下記の情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/a6b736b7-6a1f-1956-5578-aeb7ea5d84d2.png)


### ④DynamoDBとS3作成
情報を確認の上、インフラ構成の作成を行います。
Terraformの設定を保存するために、DynamoDBとS3の作成を行い。

Terraformファイルで環境設定を指定する必要があります、下記のように環境を合わせて修正する。

variable "env"{
  default="prod"
}

variable "developer"{
  default="dev"
}

variable "project_version"{
  default="v01"
}

Terraformの必要なモジュールの設定ため、Terminalで下記のコマンドを実行する
terraform init
このメッセージが表示されます。
│ If you wish to attempt automatic migration of the state, use "terraform
│ init -migrate-state".
│ If you wish to store the current configuration with no changes to the
│ state, use "terraform init -reconfigure".

エラーが発生しない場合はAWSに展開するもののバリデーションと成果テストのため、下記のコマンドを実行します。
terraform plan

AWSへ適用ため、applyコマンドを実行します。
terraform apply

結果は下記のイメージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/b4727e01-c7a5-3c61-ac69-f2f3c6109a0c.png)

DynamoDBとS3は下記のように作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387054/f23fb70c-2fba-fa14-6daa-7554a3e700c0.png)

### ⑤Terraform展開


Teraformファイルで作成したdynamodbとs3バケットをコピーする。
teraform{
	required_version=">=0.12.0"
	backend="S3"{
	region ="ap-xxxx-1"
	bucket =prod-xxxx-terraform-v01"
	dynamodb_table ="prod-xxxx-terraform-state-lock-v01"
	key          ="./terraform.tfsate"
	}
}

更新後Terminalを開いて下記のコマンドを実行する
terraform init
terraform plan （※）
terraform apply

※lock stateエラーが発生する時に、コマンドに -lock=falseを追加してから実行します。

実行が完了したら、下記のイメージで表示されます。

Run terraform success
output updateを上にコピーします

**Outputs:**

bastion_security_group = "prod-abc-testsite-bastion-sg-20210811125740118500000005"
examinator_cloudfront = "d3pxoqov8cscxi.cloudfront.net"
examinator_domain = "prod-examinator.kh-site_services.net"
examinator_s3_bucket = "prod-examinator.kh-site_services.net"
kh_cloudfront = "d1fvmjxi4u4mf7.cloudfront.net"
kh_domain = "prod-cms-kh.kh-site_service.net"
kh_s3_bucket = "prod-cms-kh.kh-site_service.net"
domain_certificate = "Region: {us-xxx-1}. Cer: *.kh-site_service.net"
abc_ecs_alb = "prod-abc-xxx-alb-1805414999.ap-northeast-1.elb.amazonaws.com"
abc_vpc = "vpc-0788d809b4d578c05"
abc_vpc_security_group = "sg-0da36f8fd568866c1"
abc_vpc_subnet_database = [
  "subnet-10a6ea0769944a11a0",
  "subnet-209a6bc288ef8cb88c",
  "subnet-30d8aa8be98e25b86a",
]
abc_vpc_subnet_private = [
  "subnet-10b9fa501f91b3b3c8",
  "subnet-10db375eec3d7bf36a",
  "subnet-103ec0e4a4d174dce0",
]
abc_vpc_subnet_public = [
  "subnet-003adb19f3424eb1adf",
  "subnet-003db18f87d41965dd8",
  "subnet-00c619164e9187f2287",
]
s3_bucket_name = "prod-abc-xxx-logo-upload"
owner_cloudfront = "d3ghdpxv1nxu3f.cloudfront.net"
owner_domain = "prod-cms-owner.kh-site_service.net"
owner_s3_bucket = "prod-cms-owner.kh-site_service.net"

Teraformビルドが完了しました。

[AWSサーバーレス](https://onetech.jp/blog/what-is-serverless-12687)に関して、詳細に関して下記のホームページへ問い合わせください。
Source: https://onetech.jp/