Проблемы с модом Go с модулем terraform, который создает двоичные файлы golang

# #go #terraform #terraform-provider-aws #go-modules

Вопрос:

Я нахожусь на последнем этапе побочного проекта, и я не могу заставить terraform создавать мои двоичные файлы golang теперь, когда я пытаюсь развернуть свой код в качестве модуля terraform.

Мой вызов модуля терраформирования выглядит следующим образом.

 module "moot" {
  source = "github.com/seanturner026/moot.git"

  name                           = "moot"
  admin_user_email               = "blah@example.com"
  enable_delete_admin_user       = false
  github_token                   = "42"
  gitlab_token                   = "42"
  slack_webhook_url              = "42"
  fqdn_alias                     = ""
  hosted_zone_name               = ""
  enable_api_gateway_access_logs = false
  tags                           = { Name = "moot" }
}
 

По какой-то причине модули go путаются с моими null_resource s, которые я использую для создания двоичных файлов golang lambda при развертывании через модуль.

Этот вызов модуля создает целую кучу вещей, но вы можете создать довольно минимальные ресурсы и все равно вызвать ошибку следующей командой.

terraform apply -target='module.moot.null_resource.lambda_build["users"]'

При выполнении этой команды возникают следующие ошибки:

 module.moot.null_resource.lambda_build["users"]: Creating...
module.moot.null_resource.lambda_build["users"]: Provisioning with 'local-exec'...
module.moot.null_resource.lambda_build["users"] (local-exec): Executing: ["/bin/sh" "-c" "export GO111MODULE=on"]
module.moot.null_resource.lambda_build["users"]: Provisioning with 'local-exec'...
module.moot.null_resource.lambda_build["users"] (local-exec): Executing: ["/bin/sh" "-c" "GOOS=linux go build -ldflags '-s -w' -o .terraform/modules/moot/bin/users .terraform/modules/moot/cmd/users/."]
module.moot.null_resource.lambda_build["users"] (local-exec): no required module provides package .terraform/modules/moot/cmd/users: go.mod file not found in current directory or any parent directory; see 'go help modules'
 

null_resource Код находится здесь https://github.com/seanturner026/moot/blob/e51aee51d12472735e6bc5902e54dd603f750aff/r_lambda.tf#L1-L23

Пример, в котором используется источник модуля ../../ (а не ссылка на github), успешно работает. Я не уверен, почему, но, возможно, это потому go.mod , что находится в верхнем каталоге? В любом случае, этот пример можно развернуть здесь, и приведенная выше terraform apply команда работает https://github.com/seanturner026/moot/blob/stackoverflow/terraform_examples/complete/main.tf

У меня также есть файл makefile, расположенный здесь https://github.com/seanturner026/moot/blob/stackoverflow/Makefile. Запуск make build также завершается неудачно

 $ make build
export GO111MODULE=on
env GOOS=linux go build -ldflags="-s -w" -o bin/auth         cmd/auth/. amp;
env GOOS=linux go build -ldflags="-s -w" -o bin/releases     cmd/releases/. amp;
env GOOS=linux go build -ldflags="-s -w" -o bin/repositories cmd/repositories/. amp;
env GOOS=linux go build -ldflags="-s -w" -o bin/users        cmd/users/. amp;
package cmd/auth is not in GOROOT (/usr/local/go/src/cmd/auth)
package cmd/releases is not in GOROOT (/usr/local/go/src/cmd/releases)
package cmd/repositories is not in GOROOT (/usr/local/go/src/cmd/repositories)
package cmd/users is not in GOROOT (/usr/local/go/src/cmd/users)
 

Как мне решить эту проблему? Я недавно переименовал репо, может ли это вызвать проблемы?

Вот макет каталога, который я указываю github.com/seanturner026/moot.git в качестве источника вызова модуля.

 .
├── .terraform
│   └── modules
│       └── moot
│           ├── .editorconfig
│           ├── .gitignore
│           ├── Makefile
│           ├── README.md
│           ├── archive
│           ├── assets
│           │   ├── repositories-add.png
│           │   ├── repositories.png
│           │   └── users.png
│           ├── bin
│           │   └── users
│           ├── cmd
│           │   ├── auth
│           │   │   ├── events.json
│           │   │   ├── login.go
│           │   │   ├── login_test.go
│           │   │   ├── main.go
│           │   │   ├── reset_password.go
│           │   │   └── reset_password_test.go
│           │   ├── releases
│           │   │   ├── event.json
│           │   │   ├── github.go
│           │   │   ├── gitlab.go
│           │   │   ├── main.go
│           │   │   └── main_test.go
│           │   ├── repositories
│           │   │   ├── create.go
│           │   │   ├── create_test.go
│           │   │   ├── delete.go
│           │   │   ├── delete_test.go
│           │   │   ├── events.json
│           │   │   ├── list.go
│           │   │   ├── list_test.go
│           │   │   └── main.go
│           │   └── users
│           │       ├── create.go
│           │       ├── create_test.go
│           │       ├── delete.go
│           │       ├── delete_test.go
│           │       ├── events.json
│           │       ├── list.go
│           │       ├── list_test.go
│           │       └── main.go
│           ├── data.tf
│           ├── go.mod
│           ├── go.sum
│           ├── internal
│           │   └── util
│           │       ├── generate_response_body.go
│           │       ├── generate_secret_hash.go
│           │       ├── main.go
│           │       └── post_to_slack.go
│           ├── locals.tf
│           ├── modules.tf
│           ├── outputs.tf
│           ├── r_acm.tf
│           ├── r_api_gateway.tf
│           ├── r_cloudwatch.tf
│           ├── r_cognito.tf
│           ├── r_dynamodb.tf
│           ├── r_iam.tf
│           ├── r_lambda.tf
│           ├── r_null.tf
│           ├── r_route53.tf
│           ├── r_s3.tf
│           ├── r_ssm.tf
│           ├── terraform_assets
│           │   ├── cognito.go
│           │   ├── cognito_invite_template.html
│           │   └── dynamodb_put_item_input.json
│           └── variables.tf
├── .terraform.lock.hcl
├── main.tf
├── provider.tf
├── terraform.auto.tfvars
├── terraform.tfstate
├── terraform.tfstate.backup
├── terraform.tfvars
└── variables.tf
 

Ответ №1:

нужно было поставить a ./ перед двоичными файлами cmd в null_resource том, что создает двоичные файлы лямбда

Также необходимо скопировать go.mod в каталог верхнего уровня с помощью другого null_resource

https://github.com/seanturner026/moot/pull/6/commits/3ff8e18c5449f610eb9ca99c8e89bd31717a8bd9