英文:
Go mod troubles with terraform module that builds golang binaries
问题
我是你的中文翻译助手,以下是你要翻译的内容:
我在一个边项目的最后一步,但是我无法让terraform在我尝试将代码部署为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 modules正在干扰我用来构建golang lambda二进制文件的null_resource
,当我通过模块部署时会出错。
这个模块调用构建了很多东西,但你可以构建相当简单的资源,仍然会遇到以下命令的错误:
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
使用模块源为../../
的示例确实可以成功工作。我不确定原因是什么,但可能是因为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
也会失败。
如何解决这个问题?我最近重命名了仓库,这可能会引起问题吗?
当我将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
英文:
I'm on the last step of a side project, and I can't get terraform to build my golang binaries now that I'm trying to deploy my code as a terraform module.
My terraform module invocation looks like this.
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" }
}
For some reason, go modules is messing with my null_resource
s which I use to build my golang lambda binaries when I deploy via the module.
This module invocation builds a whole heap of things, but you can build pretty minimal resources and still hit the error with the following command.
terraform apply -target='module.moot.null_resource.lambda_build["users"]'
Running this command errors out with the following:
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'
The null_resource
code is located here https://github.com/seanturner026/moot/blob/e51aee51d12472735e6bc5902e54dd603f750aff/r_lambda.tf#L1-L23
The example which uses a module source of ../../
(rather than the github link) does work successfully. I'm not sure why, but perhaps it's because go.mod
is in an upper directory? Either way, that example is deployable here, and the above terraform apply
command works https://github.com/seanturner026/moot/blob/stackoverflow/terraform_examples/complete/main.tf
I've also got a makefile located here https://github.com/seanturner026/moot/blob/stackoverflow/Makefile. Running make build
also fails
$ make build
export GO111MODULE=on
env GOOS=linux go build -ldflags="-s -w" -o bin/auth cmd/auth/. &
env GOOS=linux go build -ldflags="-s -w" -o bin/releases cmd/releases/. &
env GOOS=linux go build -ldflags="-s -w" -o bin/repositories cmd/repositories/. &
env GOOS=linux go build -ldflags="-s -w" -o bin/users cmd/users/. &
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)
How do I go about fixing this problem? I recently renamed the repo, could that be causing issues?
Here's the directory layout when I'm specifying github.com/seanturner026/moot.git
as the module invocation source.
.
├── .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
得分: 1
在构建 Lambda 二进制文件的 null_resource
中,需要在命令二进制文件前面加上 ./
还需要使用另一个 null_resource
将 go.mod 复制到顶级目录中
https://github.com/seanturner026/moot/pull/6/commits/3ff8e18c5449f610eb9ca99c8e89bd31717a8bd9
英文:
needed to put a ./
in front of the cmd binaries in the null_resource
that builds the lambda binaries
Also needed to copy go.mod to the top level directory with another null_resource
https://github.com/seanturner026/moot/pull/6/commits/3ff8e18c5449f610eb9ca99c8e89bd31717a8bd9
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论