AWSで、Terraformを利用する方法をまとめてみた(1/10)

Terraformとは？
--
Terraformは、クラウド上のインフラストラクチャをコードで定義するためのツール。

どのような機能があるのか？
--

__1.	プロバイダーの定義__
AWS、Microsoft Azure、Google Cloud Platformなど、Terraformが対応するクラウドプロバイダーを指定出来る。
__2.	リソースの定義__
EC2インスタンス、S3バケット、VPCなど、クラウドプロバイダーが提供するリソースをコードで定義出来る。
__3.	モジュールの使用__
共通の機能を持つリソースを再利用可能なモジュールとして定義し、コードの重複を減らす事が出来る。
__4.	ステート管理__
Terraformが管理するリソースの状態をファイルに保存し、次回のデプロイ時に状態を維持出来る。
__5.	デプロイ__
Terraformが定義したリソースをクラウドプロバイダーにデプロイし、インフラストラクチャを構築。
コードによるインフラストラクチャの管理により、バージョン管理や変更履歴の管理が容易になる。

AWSを対象としたTerraformの環境構築手順
（Windows PC向け）
--

__1.	AWS CLIのインストール__
Terraformを使用するためには、AWS CLIがインストールされている必要があります。
AWS CLIのインストール方法については、
AWS公式サイト（https://aws.amazon.com/cli/）を参照してください。
__2.	AWSアクセスキーの作成__
AWSにログインし、IAMからアクセスキーを作成します。アクセスキーは、後でTerraformでAWSリソースにアクセスする際に使用します。
__3.	Terraformのダウンロード__
Terraformの公式サイト（https://www.terraform.io/downloads.html）から、
Windows用のTerraformバイナリをダウンロードします。
__4.	バイナリのインストール__
ダウンロードしたTerraformバイナリを展開し、インストール先となるディレクトリに移動します。例えば、C:\terraformというディレクトリを作成して、その中にTerraformバイナリを配置します。
__5.	Terraformの初期化__
Terraformのコードが格納されたディレクトリで、terraform initコマンドを実行します。このコマンドにより、TerraformがAWSプロバイダを使用できるようになります。
__6.	AWSの認証情報の設定例__
TerraformがAWSにアクセスするためには、AWSの認証情報を設定する必要があります。
次のようにコマンドプロンプトで環境変数を設定します。
~~~
set AWS_ACCESS_KEY_ID=<access-key> 
set AWS_SECRET_ACCESS_KEY=<secret-key> 
~~~
__7.	Terraformのコードの作成__
Terraformで管理するAWSリソースをコードで定義します。
例えば、EC2インスタンスを作成する場合は、.tfファイルにaws_instanceリソースを定義します。
__8.	Terraformの実行__
terraform applyコマンドを実行して、コードに従ってAWSリソースを作成します。
また、terraform planコマンドを実行することで、作成されるAWSリソースの変更点を確認することもできます。
__9.	Terraformのクリーンアップ__
AWSリソースの変更を取り消す場合は、terraform destroyコマンドを実行してリソースを削除します。


手順
--

__1.	プロジェクトディレクトリの作成__
Terraformを実行するためには、プロジェクトディレクトリを作成する必要があります。
~~~
mkdir myproject 
cd myproject 
~~~
__2.	AWS認証情報の設定__
TerraformでAWSにアクセスするAWSアクセスキーとシークレットアクセスキーを設定する。
AWS CLIを使用してAWS認証情報を設定することができます。
~~~
$ aws configure AWS Access Key ID [None]: 
************ AWS Secret Access Key [None]:
 ************ Default region name [None]:
 ap-northeast-1 Default output format [None]: json
~~~

__3.コード記載(サンプル)__

__AWSのAuto ScalingグループをALBに接続する方法__

1.ALBリソースを作成します。
~~~
resource "aws_lb" "example" {
  name               = "example-lb"
  internal           = false
  load_balancer_type = "application"
  subnets            = [aws_subnet.example1.id, aws_subnet.example2.id]
  security_groups    = [aws_security_group.example.id]
}
~~~
2.AMIイメージを指定するLaunch Configurationリソースを作成します。
~~~
resource "aws_launch_configuration" "example" {
  name                 = "example-lc"
  image_id             = "ami-0123456789abcdef"  # ここにAMIイメージIDを指定
  instance_type        = "t2.micro"              # インスタンスタイプを指定
  security_groups      = [aws_security_group.example.id]
  key_name             = "example-keypair"
  associate_public_ip_address = true
  user_data = <<-EOF
              # インスタンスの初期化スクリプトをここに指定
              # 例えば、Apache Web Serverをインストールするシェルスクリプトをここに記述
              # EOF
              EOF
}
~~~
3.Auto Scalingグループリソースを作成します。
例として、最小数1、最大数3のAuto Scalingグループを作成
~~~
resource "aws_autoscaling_group" "example" {
  name                 = "example-asg"
  launch_configuration = aws_launch_configuration.example.id
  min_size             = 1
  max_size             = 3
  target_group_arns    = [aws_lb_target_group.example.arn]
  vpc_zone_identifier  = [aws_subnet.example1.id, aws_subnet.example2.id]
  health_check_type    = "EC2"
}
~~~
4.ALBターゲットグループを作成します。
~~~
resource "aws_lb_target_group" "example" {
  name     = "example-tg"
  port     = 80
  protocol = "HTTP"

  health_check {
    path = "/"
  }
}
~~~
Auto ScalingグループがALBに接続されます。


作成したコードを実行する
--

__Terraformが管理するリソースの定義__
main.tfには、Terraformが管理するリソースを定義するコードが含まれています。
AWSのEC2インスタンスやRDSなどのリソースです。上記サンプルコードが該当します。

__Terraform初期化__
Terraformプロジェクトを初期化します。
~~~
terraform init
~~~
terraform initコマンドを実行して、必要なプロバイダやモジュールの初期化を行います。このコマンドを実行することで、main.tfで指定されたプロバイダのバージョンを解決し、必要なモジュールをダウンロードすることができます。

__Terraformの構文確認__
Terraformコードの構文を確認します。
~~~
terraform validate
~~~
__Terraformの実行計画の確認__
Terraformの実行計画を確認します。
~~~
terraform plan
~~~
terraform planコマンドを実行して、変更内容を確認します。このコマンドを実行することで、Terraformがどのような変更を加えるかを表示することができます。

__Terraformの実行__
Terraformコードを実行します。
~~~
terraform apply
~~~
terraform applyコマンドを実行して、実際に変更を加えます。このコマンドを実行することで、main.tfに定義されたリソースが作成、更新、削除されます。

__Terraformの削除__
Terraformコードで作成されたリソースを削除します。
~~~
terraform destroy
~~~
terraform destroyコマンドを実行して、作成したリソースを削除することができます。このコマンドを実行することで、main.tfに定義されたリソースが削除されます。

AWSで、Terraformを利用する方法をまとめてみた(2/10)
https://qiita.com/kimuni-i/items/6298ed10adc6ad450488
AWSで、Terraformを利用する方法をまとめてみた(3/10)
https://qiita.com/kimuni-i/items/4d2f90506eb2dd4ee702
AWSで、Terraformを利用する方法をまとめてみた(4/10)
https://qiita.com/kimuni-i/items/b97089a820cc06ed2d9c
AWSで、Terraformを利用する方法をまとめてみた(5/10)
https://qiita.com/kimuni-i/items/11efb60b9a731d212211
AWSで、Terraformを利用する方法をまとめてみた(6/10)
https://qiita.com/kimuni-i/items/943daf8f4e80af12b70e
AWSで、Terraformを利用する方法をまとめてみた(7/10)
https://qiita.com/kimuni-i/items/b2cc6e1e4b5d5c1a92cb
AWSで、Terraformを利用する方法をまとめてみた(8/10)
https://qiita.com/kimuni-i/items/2934372c385ba0561425
AWSで、Terraformを利用する方法をまとめてみた(9/10)
https://qiita.com/kimuni-i/items/edbdc88f0bca9c0354d2
AWSで、Terraformを利用する方法をまとめてみた(10/10)
https://qiita.com/kimuni-i/items/2f900d792c38ad93979c