在参考书《实践Terraform》中遇到了困难

在看这本神秘的书时,我会边看边记录想到的点子。

第五章 权限管理

(1) 错误:无法查询可用的供应商安装包

错误内容 (Error content)

在一定程度上前进后,尝试执行代码时,执行了”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) 服务提供商.亚马逊服务.地区

请提供更多上下文信息。

当执行代码时,会被询问地区。

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

处理方法 fǎ)

由于Shell环境变量被重置,所以需要重新设置。

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

第八章 负载均衡器和DNS

(3) 错误:删除负载均衡器时发生错误:OperationNotPermitted: 负载均衡器无法删除。

错误内容 (Mistake content)

我试图删除,输入了”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

发生了错误。

处理方法

loadbalancer.png

错误:删除S3 桶时出现错误。

错误消息

我输入了”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上获取廉价的域名。

お名前ドットコム.png

在AWS控制台上创建主机区域。

ホストゾーン.png

将DNS注册到お名前.com。

route53.png
お名前DNS.png

写入从 terraform 代码中获取到的域名

data "aws_route53_zone" "example" {
  name = "取得したドメイン名"
}

(6) 错误:无效索引

错误内容 (é cuò

$ 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]

错误:不支持的参数

错误内容 (Error content)

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.

处理方法 fǎ)

由于写作方式看起来有些陈旧,所以需要改变写作方式。

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

第14章 部署管道

提交git commit很慢。

当我试图将文件推送到GitHub的存储库时,由于速度非常慢,我选择忽略此操作。

$ 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

创建 CodePipeline 时出现错误:无效的操作声明异常。

错误内容 (Mistake content)

$ 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" {

处理方法

我参考了这篇文章。或者说,看了这篇文章后,我总的来说能理解得很好。太棒了。

补充说明

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パラメータから指定
      }
    }
  }
~後略~
广告
将在 10 秒后关闭
bannerAds