terraform - 在主输出中找不到模块源的 Terraform 输出
问题描述
这是我得到的错误:
错误:引用未声明的资源
在 output.tf 第 2 行,在输出 "api-gateway-codedeploy-app-name":
2: value = "${api-gateway-codedeploy.app-name}"未在根模块中声明托管资源“api-gateway-codedeploy”“app-name”。
我的 terraform 相关文件夹结构是
terraform
|_ api-gatewy.tf
|_ listing-service.tf
|_ users-service.tf
|_ outputs.tf
|_ codedeploy
|_ iam-instance-profiles.tf
|_ main.tf
|_ outputs.tf
|_ s3.tf
|_ variables.tf
即使 api-gateway 内的模块将 codedeploy-app 文件夹作为源,主输出文件也无法识别 codedeploy 输出。与用户/客户端服务相同,所以我只是附加了 api 模块作为示例
terraform/api-gateway.tf(api-gateway-codedeploy 模块)
module "api-gateway-codedeploy" {
source = "./codedeploy-app"
app-name = "api-gateway"
ec2-instance-name = module.api-gateway.name
}
terraform/outputs.tf
output "api-gateway-codedeploy-app-name" {
value = api-gateway-codedeploy.app-name
}
output "api-gateway-deployment-bucket-name" {
value = api-gateway-codedeploy.deployment-bucket-name
}
output "api-gateway-private-ip" {
value = module.api-gateway.private-ip
}
output "api-gateway-public-ip" {
value = aws_eip.api-gateway-eip.public_ip
}
output "aws-region" {
value = var.aws-region
}
output "listing-service-codedeploy-app-name" {
value = listing-service-codedeploy.app-name
}
output "listing-service-deployment-bucket-name" {
value = listing-service-codedeploy.deployment-bucket-name
}
output "listing-service-private-ip" {
value = module.api-gateway.private-ip
}
output "listing-service-db-address" {
value = module.listing-service-db.address
}
output "users-service-codedeploy-app-name" {
value = users-service-codedeploy.app-name
}
output "users-service-deployment-bucket-name" {
value = users-service-codedeploy.deployment-bucket-name
}
output "users-service-private-ip" {
value = module.api-gateway.private-ip
}
output "users-service-db-address" {
value = module.users-service-db.address
}
terraform/codedeploy/main.tf
resource "aws_iam_role" "codedeploy-role" {
name = "${var.app-name}-codedeploy-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "codedeploy.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
resource "aws_iam_role_policy_attachment" "aws-codedeploy-role" {
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole"
role = aws_iam_role.codedeploy-role.name
}
resource "aws_codedeploy_app" "default" {
compute_platform = "Server"
name = var.app-name
}
resource "aws_codedeploy_deployment_group" "prod" {
app_name = aws_codedeploy_app.default.name
deployment_group_name = "prod"
service_role_arn = aws_iam_role.codedeploy-role.arn
ec2_tag_set {
ec2_tag_filter {
key = "Name"
type = "KEY_AND_VALUE"
value = var.ec2-instance-name
}
}
}
terraform/codedeploy/s3.tf
resource "aws_s3_bucket" "deploy-bucket" {
bucket = "katoms-microservices-demo-${var.app-name}-deployment"
}
terraform/codedeploy/variables.tf
variable "app-name" {
type = string
}
variable "ec2-instance-name" {
type = string
}
terraform/codedeploy/iam-instance-profiles.tf
resource "aws_iam_instance_profile" "ec2" {
name = "${var.app-name}-ec2"
role = aws_iam_role.ec2.name
terraform/codedeploy/outputs.tf
output "app-name" {
value = aws_codedeploy_app.default.name
}
output "deployment-bucket-name" {
value = aws_s3_bucket.deploy-bucket.id
}
output "iam-instance-profile" {
value = aws_iam_instance_profile.ec2.name
}
解决方案
您将遇到更多类似的错误。但是要修复您提到的问题,请修复以下内容:
output "api-gateway-codedeploy-app-name" {
value = api-gateway-codedeploy.app-name
}
到引用模块的正确的:
output "api-gateway-codedeploy-app-name" {
value = module.api-gateway-codedeploy.app-name
}
推荐阅读
- python - 如何检测数字是否在字符串中
- qt - 为什么 Qt 用户界面在发布模式和调试模式下看起来不同
- python - 气流使用执行日期:“日期时间”未定义
- swift - Swift NSPopUpButton 枚举
- android - 网格视图和适配器在android中不起作用
- python - 如何将值附加到具有多个“值”的字典键?
- r - Write.xlsx 运行很慢,我可以加快速度吗?
- itfoxtec-identity-saml2 - 解密 saml 断言时无法检索解密密钥
- ruby-on-rails - 在 Rails 中反序列化数据库中的列
- spring - 使用 apache OpenJPA 的 Spring Boot