参考書「実践Terraform」で詰まったところ

こちらの神本を見ながら、詰まったところをつらつらと書いていきます。
https://www.amazon.co.jp/dp/B07XT7LJLC

## 第５章 権限管理
### (1)Error: Failed to query available provider packages
#### エラー内容
ある程度進んだところで、コードを実行しようと、"terraform apply"を実行した。

```
$ terraform apply
│ Error: Could not load plugin
│
│
│ Plugin reinitialization required. Please run "terraform init".
│
│ Plugins are external binaries that Terraform uses to access and manipulate
│ resources. The configuration provided requires plugins which can't be located,
│ don't satisfy the version constraints, or are otherwise incompatible.
│
│ Terraform automatically discovers provider requirements from your
│ configuration, including providers used in child modules. To see the
│ requirements and constraints, run "terraform providers".
│
│ failed to instantiate provider "registry.terraform.io/hashicorp/awb" to obtain schema: unknown provider
│ "registry.terraform.io/hashicorp/awb"
```

のエラーが発生したので、"terraform init"を入力した。

```
$ terraform init
│ Error: Failed to query available provider packages
│
│ Could not retrieve the list of available versions for provider hashicorp/awb: provider registry registry.terraform.io does not have
│ a provider named registry.terraform.io/hashicorp/awb
│
│ All modules should specify their required_providers so that external consumers will get the correct providers when using a module.
│ To see which modules are currently depending on hashicorp/awb, run the following command:
│     terraform providers
```

と、続けてエラーが発生。

#### 対処法
"aws_lb"の綴りを、"awb_lb"に間違えていた。

### (2)provider.aws.region
#### 内容
コードを実行したら、リージョンを聞かれた。

```
$ terraform apply
The region where AWS operations will take place. Examples
are us-east-1, us-west-2, etc.
Enter a value:
```

#### 対処法
シェルの環境変数がリセットされてしまっているので、セットし直す。

```
$ history 100 | grep AWS_
$ export AWS_ACCESS_KEY_ID=(アイディー）
$ export AWS_SECRET_ACCESS_KEY=（キー）
$ export AWS_DEFAULT_REGION=（リージョン）
$ terraform apply
```

## 第８章 ロードバランサーとDNS
### (3)Error: error deleting LB: OperationNotPermitted: Load balancer
#### エラー内容
削除しようと、"terraform destroy"を入力した。

```
$ terraform destroy
Error: error deleting LB: OperationNotPermitted: Load balancer 'arn:aws:elasticloadbalancing:ap-northeast-1:〜' cannot be deleted because deletion protection is enabled
```
のエラーが発生。
#### 対処法
ロードバランサーの削除の保護が有効になっているので、AWSのコンソール画面で有効のチェックを外す
EC2 → ロードバランサー → アクション → 属性の編集
![loadbalancer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/582d8e79-459e-ce89-b388-28b1e1098bc2.png)

### (4)Error: error deleting S3 Bucket
#### エラー内容
削除しようと、"terraform destroy"を入力した。

```
$ terraform destroy
Error: error deleting S3 Bucket (〜〜〜): BucketNotEmpty: The bucket you tried to delete is not empty
```
のエラーが発生。
#### 対処法
S3にロードバランサーへのアクセスのログが残ってしまっているので、削除する。
参考記事 https://qiita.com/ChaseSan/items/11fe05926c700220d3cc

```
$ aws s3 rm s3://bucket-name --recursive
```

### (5)ドメインの登録
#### 1.お名前.comで安いドメインを取得する
自動更新の解除処理忘れずに！
https://www.onamae.com/
![お名前ドットコム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/b8c996c1-af50-4dd9-3db9-f5d7f69dca92.png)

#### 2.ホストゾーンをAWSコンソールで作成
Route53 → ホストゾーン → ホストゾーンの作成
![ホストゾーン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/d20e43ce-9e5c-1a76-3d18-f9e5bf7c1df4.png)

#### 3.DNSをお名前.comに登録する
最後のドット"."は要らない。
![route53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/c861177e-2bc1-2b25-97ca-1d79e3fa7181.png)

![お名前DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/29ff0653-3014-9a07-ca80-13f0c4a339c1.png)

#### 4.terraformのコードに所得したドメインを書く
```
data "aws_route53_zone" "example" {
  name = "取得したドメイン名"
}
```

### (6)リスト8.8 Error: Invalid index
#### エラー内容
```
$ terraform apply

Error: Invalid index

  on lb.tf line 100, in resource "aws_route53_record" "example_certificate":
 100:   name = aws_acm_certificate.example.domain_validation_options[0].resource_record_name

This value does not have any indices.
```
#### 対処法
書き方が古いみたいなので、書き方を変える
参考記事 https://qiita.com/fullsat_/items/a2843ec5fe36484f8e19

```
tolist(aws_acm_certificate.cert.domain_validation_options)[0]
```

### (7)8.13 Error: Unsupported argument
#### エラー内容
```
terraform apply

Error: Unsupported argument

  on lb.tf line 178, in resource "aws_lb_listener_rule" "example":
 178:     field = "path-pattern"

An argument named "field" is not expected here.
```
#### 対処法
書き方が古いみたいなので、書き方を変える

```
  condition {
    path_pattern {
      values = ["/*"]
    }
  }
```

## 第14章 デプロイメントパイプライン
### git commitが重い
GitHubのレポジトリにpushしようとすると、とても重いので、gitignoreします。

```
$ vim .gitignore
```

```
.terraform
.terraform.lock.hcl
terraform.tfstate
terraform.tfstate.backup
.terraform.tfstate.lock.info
```

```
$ git init
$ git add .
$ git commit -m 'modified gitignore'
$ git remote add ~~~~
$ git push origin master
```

### Error creating CodePipeline: InvalidActionDeclarationException
#### エラー内容
```
$ terraform apply
...
Error: Error creating CodePipeline: InvalidActionDeclarationException: Action configuration for action 'Source' is missing required configuration 'OAuthToken'

  on cpl.tf line 126, in resource "aws_codepipeline" "example":
 126: resource "aws_codepipeline" "example" {
```

#### 対処法
こちらの記事を参考にしました。というか、この記事見れば、全般的に理解できる。神記事。
https://qiita.com/ayatothos/items/27024e8168a8b766bcd3

追記

```
data "aws_ssm_parameter" "github_token" {
  name = "/continuous_apply/github_token"
}
```

修正

```
# リスト14.10
# CodePipelineの定義(例では3つのステージで実装する)
resource "aws_codepipeline" "example" {
  name     = "example"
  role_arn = module.codepipeline_role.iam_role_arn

  # Sourceステージ：GitHubからソースコードを取得する
  stage {
    name = "Source"

    action {
      name             = "Source"
      category         = "Source"
      owner            = "ThirdParty"
      provider         = "GitHub"
      version          = 1
      output_artifacts = ["Source"]

      configuration = {
~中略~
        PollForSourceChanges = false
        OAuthToken           = data.aws_ssm_parameter.github_token.value # SSMパラメータから指定
      }
    }
  }
~後略~
```