我需要 terraform 来访问我的 S3 存储桶,但它无法在指定区域找到存储桶。
我的主要.tf:
provider "aws" {
region = "eu-west-2"
}
terraform {
backend "s3" {
bucket = "xyz-state-blog"
key = "dev/terraform"
region = "eu-west-2"
}
}
locals {
azs = ["eu-west-2a", "eu-west-2b", "eu-west-2c"]
environment = "dev"
kops_state_bucket_name = "${local.environment}-kops-state"
// Needs to be a FQDN
kubernetes_cluster_name = "k8s-dev0.domain.com"
ingress_ips = ["10.0.0.100/32", "10.0.0.101/32"]
vpc_name = "${local.environment}-vpc"
tags = {
environment = "${local.environment}"
terraform = true
}
}
data "aws_region" "current" {}
Run Code Online (Sandbox Code Playgroud)
以下是我收到terraform init命令的错误:
Error inspecting states …Run Code Online (Sandbox Code Playgroud) 在尝试了解如何aws_instance使用AWS VPC 配置时,会发生以下错误:
* Error launching source instance: InvalidParameterCombination: The parameter groupName cannot be used with the parameter subnet
status code: 400, request id: []
Run Code Online (Sandbox Code Playgroud)
要么
* Error launching source instance: InvalidParameterCombination: VPC security groups may not be used for a non-VPC launch
status code: 400, request id: []
Run Code Online (Sandbox Code Playgroud) 我希望我的Terraform配置通过调用命令来配置服务器并在最后启动服务并继续运行它.我尝试使用nohup和屏幕使用remote-exec:
nohup的:
provisioner "remote-exec" {
inline = "nohup sudo command &"
}
Run Code Online (Sandbox Code Playgroud)
屏幕:
provisioner "remote-exec" {
inline = "screen -d -m sudo command"
}
Run Code Online (Sandbox Code Playgroud)
我通过手动登录来检查命令是否正在运行.但他们没有保持流程运行.如果我手动尝试这些命令并且使用ssh调用它们也可以.
如何在返回控制流时使用Terraform配置来启动命令并使其保持运行?
使用terraform在AWS中部署相当大的基础架构时,我们的遥控器tfstate已损坏并被删除.
从文档中,我收集到terraform refresh应该查询AWS以获取基础结构的真实状态并按顺序更新tfstate,但这不会发生:我的tfstate未受影响而plan + apply会产生很多Already existing错误.
什么是terraform refresh真的?
我正在使用Terraform在AWS中创建一些服务.其中一项服务是ECS任务定义.我按照文档操作,并不断收到以下错误:
aws_ecs_task_definition.github-backup: ClientException: Fargate requires task definition to have execution role ARN to support ECR images.
status code: 400, request id: 84df70ec-94b4-11e8-b116-97f92c6f483f
Run Code Online (Sandbox Code Playgroud)
首先task_role_arn是可选的,我可以看到创建了一个新角色.我还尝试使用任务定义所需的权限创建一个角色.
这就是我所拥有的:
resource "aws_ecs_task_definition" "github-backup" {
family = "${var.task_name}"
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
cpu = "${var.fargate_cpu}"
memory = "${var.fargate_memory}"
task_role_arn = "${aws_iam_role.github-role.arn}"
container_definitions = <<DEFINITION
[
{
"cpu": ${var.fargate_cpu},
"image": "${var.image}",
"memory": ${var.fargate_memory},
"name": "github-backup",
"networkMode": "awsvpc"
}
]
DEFINITION
}
Run Code Online (Sandbox Code Playgroud)
resource "aws_iam_policy" "access_policy" {
name = "github_policy"
policy = <<EOF
{ …Run Code Online (Sandbox Code Playgroud) 网上有很多例子展示了如何在部署在 GCP/GCE 上的虚拟机上使用 Terraform 运行启动脚本,但它们都使用内联启动脚本,所有启动脚本代码都包含在 terraform compute.tf 文件中。这可以通过启动脚本的单行或多行的 <<SCRIPT[script code]SCRIPT 来完成。我还没有找到一个示例来展示如何将启动脚本参数分配给本地磁盘上的另一个文件,可能与 compute.tf 位于同一目录中。用数百行启动脚本将compute.tf 弄得一团糟。没有更好的方法来做到这一点吗?
我意识到我可以编写一个包装脚本,将一个 compute.tf 和一个单独的启动文件组合到一个 compute.tf 中,然后运行 terraform,但我正在寻找一条更直接的路线,假设存在。
谢谢你。
我正在尝试在 Terraform (v 0.13.0) 中设置我当前的基础设施。我只是从迁移现有的 lambda 函数开始。我已使用以下代码尝试将 .net core 3.1 中的现有 lambda 函数上传到 AWS(provider v.3.0)。我手动部署没有问题,但这显然不是目标。
这是 IAM 角色:
resource "aws_iam_role" "role_lambda" {
name = "roleLambda"
assume_role_policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
POLICY
}
Run Code Online (Sandbox Code Playgroud)
在函数下方(注意我混淆了一些值):
resource "aws_lambda_function" "lambda_tf" {
function_name = "LambdaTFTest"
role = aws_iam_role.role_lambda.arn
handler = "Lambda::Lambda.Function::FunctionHandler"
runtime = "dotnetcore3.1"
s3_bucket = "arn:aws:s3:::xxxx-xxxxxx"
s3_key = "Lambda.zip"
s3_object_version = "XxXxXxXxXxXxXxXxXxXxXxXxXxXx"
}
Run Code Online (Sandbox Code Playgroud)
但是,我不断收到此错误作为输出,但没有更多详细信息:
Error: Error …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda terraform terraform-provider-aws
在 terraform 中有一个在 aws 中创建 EC2 机器的示例。
# Create a new instance of the latest Ubuntu 20.04 on an
# t3.micro node with an AWS Tag naming it "HelloWorld"
provider "aws" {
region = "us-west-2"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = { …Run Code Online (Sandbox Code Playgroud) 我有以下文件夹结构:
\ninfrastructure\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80security-groups\n\xe2\x94\x82 \xe2\x94\x82 main.tf\n\xe2\x94\x82 \xe2\x94\x82 config.tf\n\xe2\x94\x82 \xe2\x94\x82. security_groups.tf\n\xe2\x94\x82 \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80instances\n \xe2\x94\x82 main.tf\n \xe2\x94\x82 config.tf\n \xe2\x94\x82 instances.tf\nRun Code Online (Sandbox Code Playgroud)\n我想通过引用来引用 security-groups 文件夹中实例化的安全组 ID。\n我尝试使用以下命令在 security_groups.tf 文件中输出所需的 ID
\noutput "sg_id" {\n value = "${aws_security_group.server_sg.id}"\n}\nRun Code Online (Sandbox Code Playgroud)\n然后在实例文件中将其添加为模块:
\nmodule "res" {\n source = "../security-groups"\n}\nRun Code Online (Sandbox Code Playgroud)\n这种方法的问题是,当我在实例文件夹中执行 terraform apply 时,它也会尝试创建安全组(我已经通过在安全组文件夹中执行 terraform apply 创建了安全组),但它失败了,因为 SG 是现存的。
\n在不更改代码结构的情况下引用在不同文件夹中创建的资源的最简单方法是什么?
\n谢谢。
\n通过以下内容,我可以循环遍历资源块,轻松地将路由表关联添加到“所有”子网。但是,我只需要为我的公共子网创建关联。
我怎样才能使这个“if”语句起作用?或者任何其他方式来过滤each.value.class == "pub"此事。
resource "aws_route_table_association" "rtb-pub" {
for_each = local.subnets_map
if each.value.class == "pub" ## <---- how?
route_table_id = aws_route_table.rtb-pub.id
subnet_id = aws_subnet.map["${each.value.subnet}"].id
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
terraform ×10
amazon-ecs ×1
amazon-vpc ×1
aws-lambda ×1
gnu-screen ×1
nohup ×1
startup ×1
vpc ×1