有没有一种方法可以为项目中定义的所有模块抽象提供程序。
例如,我有这个项目
??? modules
? ??? RDS
? ??? VPC
??? stacks
??? production
? ??? main.tf
??? staging
??? main.tf
Run Code Online (Sandbox Code Playgroud)
而且工作正常...问题在于模块的定义
??? RDS
? ??? README.md
? ??? main.tf
? ??? providers.tf
? ??? variables.tf
??? VPC
??? README.md
??? main.tf
??? providers.tf
??? variables.tf
Run Code Online (Sandbox Code Playgroud)
这两个模块中的提供者完全相同
# providers.tf
provider "aws" {
region = "${var.region}"
version = "~> 1.26"
}
Run Code Online (Sandbox Code Playgroud)
并且每个模块中的变量都不同,但是它们都有region变量。
# variables.tf
variable "region" {
default = "eu-central-1"
description = "AWS region."
}
# other module dependent …Run Code Online (Sandbox Code Playgroud) 我有要在AWS中使用Terraform部署的基础架构。该基础架构可以部署到我正在使用工作空间的不同环境中。
应该为每个工作区分别创建部署中的大多数组件,但是我希望在它们之间共享几个关键组件,主要是:
例如:
resource "aws_iam_role" "lambda_iam_role" {
name = "LambdaGeneralRole"
policy = <...>
}
resource "aws_lambda_function" "my_lambda" {
function_name = "lambda-${terraform.workspace}"
role = "${aws_iam_role.lambda_iam_role.arn}"
}
Run Code Online (Sandbox Code Playgroud)
第一个资源是IAM角色,应在该Lambda的所有实例之间共享,并且不应重复创建一次。
第二个资源是Lambda函数,其名称取决于当前工作空间,因此每个工作空间都将部署并跟踪不同Lambda的状态。
如何在不同的Terraform工作空间之间共享资源及其状态?
我正在学习 terraform,并希望使用该工具设置 AWS 基础设施。
我们有 3 个 AWS 环境:沙箱、暂存和生产,并且拥有支持这些环境的现有基础设施。例如,我们为每个环境有 3 个独立的 VPC。
我想terraform import根据我尝试设置的环境来导入这些资源的状态。所以我本质上想这样做,虽然我知道这在语法上不正确,但你明白了。
$ terraform import aws_vpc.my_vpc -var 'environment=sandbox'
Run Code Online (Sandbox Code Playgroud)
因此我的模块设置如下
vpc/main.tf
-----------
provider "aws" {
region = "us-east-1"
}
resource "aws_vpc" "my_vpc" {
cidr_block = ""
}
vpc/variables.tf
----------------
variable "environment" {
type map = map(string)
default {
sandbox = "vpc-1234"
staging = "vpc-2345"
production = "vpc-3456"
}
}
Run Code Online (Sandbox Code Playgroud)
所以这意味着我本质上想做
$ terraform import aws_vpc.my_vpc vpc-1234
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个目标?
我正在尝试使用 Terraform 资源创建一个带有 ALB 入口的 AWS EKS 集群。
该文档表明入口将自动创建一个带有关联侦听器和目标组的负载均衡器。
Kubernetes Ingress 创建 ALB 负载均衡器、安全组和规则,但不创建目标组或侦听器。我曾尝试使用网关或应用程序子网,但没有任何区别。我尝试设置安全组,但 ALB 设置并使用了它自己的自我管理的安全组。
我依赖本指南
ALB 的卷曲让我感到
无法连接到 de59ecbf-default-mainingre-8687-1051686593.ap-southeast-1.elb.amazonaws.com 端口 80:连接被拒绝
我分别创建了 IAM 角色和 ACM 证书,因为 AWS 对这些有配额限制。我的 EKS 集群和节点角色是标准的,节点角色附加了最新的策略。
我曾经kubectl单独应用 kubernetes 入口,但结果相同。它创建 ALB 和一个安全组,其中包含端口规则,但没有目标组或侦听器。
当我将集群端点粘贴aws eks describe-cluster --name my-tf-eks-cluster --query "cluster.endpoint"到浏览器中时,我得到以下信息:
{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "forbidden: User "system:anonymous" cannot get path "/ "", "reason": "Forbidden", "details": { }, "code": 403 }
此外,入口没有 IP 地址。 …
terraform kubernetes-ingress terraform-provider-aws amazon-eks
我在远程 terraform-cloud 中管理状态
我已经下载并安装了最新的 terraform 0.13 CLI
然后我删除了.terraform。
然后我跑terraform init了,没有错误
然后我做了
? terraform apply -var-file env.auto.tfvars
Error: Provider configuration not present
To work with
module.kubernetes.module.eks-cluster.data.null_data_source.node_groups[0] its
original provider configuration at provider["registry.terraform.io/-/null"] is
required, but it has been removed. This occurs when a provider configuration
is removed while objects created by that provider still exist in the state.
Re-add the provider configuration to destroy
module.kubernetes.module.eks-cluster.data.null_data_source.node_groups[0],
after which you can remove the provider configuration again.
Releasing state lock. …Run Code Online (Sandbox Code Playgroud) 开始使用 Terraform。我正在尝试使用以下 .tf 文件配置 EC2 实例。我在尝试配置 EC2 实例的可用区的账户中已经有一个默认 VPC。
# Terraform Settings Block
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
#version = "~> 3.21" # Optional but recommended in production
}
}
}
# Provider Block
provider "aws" {
profile = "default"
region = "us-east-1"
}
# Resource Block
resource "aws_instance" "ec2demo" {
ami = "ami-c998b6b2"
instance_type = "t2.micro"
}
Run Code Online (Sandbox Code Playgroud)
我执行以下 Terraform 命令。
aws_instance.ec2demo:正在创建...
错误:启动源实例时出错:VPCIdNotSpecified:此用户没有默认 VPC。仅 EC2-Classic 和默认 VPC 支持 GroupName。状态代码:400,请求 ID:04274b8c-9fc2-47c0-8d51-5b627e6cf7cc
在 ec2-instance.tf …
我希望我的 lambda 调用 API,这需要一个 API 令牌。我想将 API 令牌放入 lambda 环境变量中。我怎样才能让 terraform 做到这一点?还是我以错误的方式接近这个?
我正在尝试使用 Terraform 部署 Cloudfront 发行版,但在指定 origin_id 时出现错误
Cloudfront 通过 Route53 查找指向负载均衡器。
resource "aws_cloudfront_distribution" "my-app" {
origin {
custom_origin_config {
http_port = 443
https_port = 443
origin_protocol_policy = "https-only"
origin_ssl_protocols = ["TLSv1.2"]
}
domain_name = "${var.domain_name}"
origin_id = "Custom-${var.domain_name}"
}
...
default_cache_behavior {
allowed_methods = ["GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "DELETE"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "${local.origin_id}"
...
Run Code Online (Sandbox Code Playgroud)
其中var.domain_name是 route53 记录,local.origin_id是唯一 ID。
执行 terraform apply 时,出现此错误:
aws_cloudfront_distribution.my-app: error creating CloudFront Distribution: NoSuchOrigin: One or more …
我正在使用 Terraform proparar。在一种情况下,我需要执行“local-exec”配置并将命令的输出 [这是 IP 地址数组] 用于下一个“远程执行”配置。
而且我无法将“local-exec”临时输出存储在本地变量中以供以后使用。我可以将它存储在本地文件中,但不能存储在中间变量中
count = "${length(data.local_file.instance_ips.content)}"
Run Code Online (Sandbox Code Playgroud)
这是行不通的。
resource "null_resource" "get-instance-ip-41" {
provisioner "local-exec" {
command = "${path.module}\\scripts\\findprivateip.bat > ${data.template_file.PrivateIpAddress.rendered}"
}
}
data "template_file" "PrivateIpAddress" {
template = "/output.log"
}
data "local_file" "instance_ips" {
filename = "${data.template_file.PrivateIpAddress.rendered}"
depends_on = ["null_resource.get-instance-ip-41"]
}
output "IP-address" {
value = "${data.local_file.instance_ips.content}"
}
# ---------------------------------------------------------------------------------------------------------------------
# Update the instnaces by installing newrelic agent using remote-exec
# ---------------------------------------------------------------------------------------------------------------------
resource "null_resource" "copy_file_newrelic_v_29" {
depends_on = ["null_resource.get-instance-ip-41"]
count = "${length(data.local_file.instance_ips.content)}"
triggers = {
cluster_instance_id …Run Code Online (Sandbox Code Playgroud) 如果有一种方法可以在 Terraform 创建 aws_lb 时获取 aws_lb 资源的分配 IP 地址?
如AWS 文档 - NLB - 要找到要列入白名单的私有 IP 地址,我们可以找出与 ELB 关联的 IP 地址。
为了能够设置安全组以将 ELB IP 地址列入白名单,因为网络负载均衡器不能没有安全组,因为网络负载均衡器没有安全组。
考虑过aws_network_interface但它不会出现错误。
错误:找不到匹配的网络接口
另外我认为 datasource 假设资源已经存在并且不能用于 Terraform 创建的资源。