我一直在尝试弄清楚如何使用 Terraform 创建具有自定义名称的应用程序负载均衡器。到目前为止我有这个:
\nresource "aws_alb" "application_load_balancer" {\n name = "${var.brand}-be-${var.environment_name}-load-balancer"\n tags = local.tags\n load_balancer_type = "application"\n subnets = data.aws_subnets.public_subnets.ids\n\n # security group\n security_groups = [aws_security_group.sg_load_balancer.id]\n}\n\n# Hosted Zone for new-dev.foocorp.com\nresource "aws_route53_zone" "zone_dev" {\n name = "new-dev.foocorp.com"\n comment = "Hosted Zone for new-dev.foocorp.com"\n records = [ aws_alb.application_load_balancer.dns_name ]\n\n tags = merge(local.tags, {\n Name = "new-dev.foocorp.com"\n })\n}\nRun Code Online (Sandbox Code Playgroud)\n但是,我得到:
\n\xe2\x95\xb7\n\xe2\x94\x82 Error: Unsupported argument\n\xe2\x94\x82 \n\xe2\x94\x82 on main.tf line 323, in resource "aws_route53_zone" "zone_dev":\n\xe2\x94\x82 323: records = [ aws_alb.application_load_balancer.dns_name ]\n\xe2\x94\x82 \n\xe2\x94\x82 An argument …Run Code Online (Sandbox Code Playgroud) amazon-web-services terraform terraform-provider-aws aws-application-load-balancer
我有以下地形配置:
resource "aws_key_pair" "default_key_pair" {
key_name = "default_key_pair"
public_key = file("../../public_keys/default_key.pub")
}
Run Code Online (Sandbox Code Playgroud)
然后,我最初运行:
terraform import aws_key_pair.default_key_pair default_key_pair
Run Code Online (Sandbox Code Playgroud)
跟进的是
terraform apply
Run Code Online (Sandbox Code Playgroud)
然后它说
# aws_key_pair.default_key_pair must be replaced
-/+ resource "aws_key_pair" "default_key_pair" {
~ arn = "arn:aws:ec2:place:id:key-pair/default_key_pair" -> (known after apply)
~ fingerprint = "safasldjfjfljasfjasodjflasjfsdljfasdjf" -> (known after apply)
~ id = "default_key_pair" -> (known after apply)
+ key_name_prefix = (known after apply)
~ key_pair_id = "key-somethin-something" -> (known after apply)
~ key_type = "ed25519" -> (known after apply)
+ public_key = …Run Code Online (Sandbox Code Playgroud) 这是我在 terraform 中的 aws_iam_role 定义
resource "aws_iam_role" "server_role" {
name = "server-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeEnvironment",
"sqs:ChangeMessageVisibility",
"sqs:ReceiveMessage",
"sqs:SendMessage",
"s3:GetObject*",
"s3:ListBucket*",
"s3:PutBucket*",
"s3:PutObject*"
],
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行时出现此错误terraform plan:
错误:应用计划时出错:
发生了 1 个错误:
aws_iam_role.server_role:发生 1 个错误:
aws_iam_role.server_role:创建 IAM 角色服务器角色时出错:MalformedPolicyDocument:AssumeRole 策略只能指定 STS AssumeRole 操作。状态代码:400,请求 ID:55f1bfaf-a121-11e9-acaf-bb57d635757b
我基本上想让服务器读/写 S3 存储桶和读/写 SQS 队列。
显然,我不能添加这些sqs:*,并s3:*在同一个地方。我怎样才能在 terraform 中做到这一点?
我试图从另一个调用一个AWS Lambda并执行Lambda链接。这样做的基本原理是,AWS不提供来自同一S3存储桶的多个触发器。
我创建了一个带s3触发器的lambda。第一个lambda的Java代码将侦听S3事件,并包含另一个lambda的调用。第二个lambda将从第一个lambda调用。两种lambda的创建都是通过terraform完成的。
Lambda A具有S3触发器。这将在特定存储桶上的S3事件上调用。Lambda A将进行处理,并使用调用请求来调用LambdaB。来自Lambda A的Lambda B调用Java中的代码是:
public class EventHandler implements RequestHandler<S3Event, String> {
@Override
public String handleRequest(S3Event event, Context context) throws RuntimeException {
InvokeRequest req = new InvokeRequest()
.withFunctionName("LambdaFunctionB")
.withPayload(json);
return "Lambda B invoked"
}
}
Run Code Online (Sandbox Code Playgroud)
两个lambda都是使用terraform创建的。以下脚本:
Lambda terraform:
module "lambda_function" {
source = "Git Path"
absolute_artifact_path = "../lambda.jar"
lambda_function_name = "LambdaFunctionA"
lambda_function_description = ""
lambda_function_runtime = "java8"
lambda_handler_name = "EventHandler"
lambda_execution_role_name = "lambda-iam-role"
lambda_memory = "512"
dead_letter_target_arn = "error-handling-arn"
}
resource "aws_lambda_permission" "allow_bucket" {
statement_id = "statementId" …Run Code Online (Sandbox Code Playgroud) 我正在尝试探索 terraform 在 AWS 中创建自动化基础设施。我不清楚如何将安全组附加到 terraform 中的 aws 实例。
例如,是否有任何属性可以指定安全组,如下所示
resource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
Run Code Online (Sandbox Code Playgroud) 我设法使用 Terraform 脚本在 AWS 上构建了一个 WAF(v1) 基础设施组件。自 2019 年 11 月起,AWS 建议改用 WAFv2,但我不知道如何使用 Terraform 编写此脚本。
我正在尝试此模块中的示例 https://registry.terraform.io/modules/terraform-aws-modules/security-group/aws/3.10.0
主要.tf:
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "${var.environment}-project-vpc"
cidr = "10.0.0.0/16"
#
# Important!
# https://github.com/terraform-aws-modules/terraform-aws-vpc/issues/403
# Only append or delete from the end of the list
#
azs = ["us-east-2a", "us-east-2b", "us-east-2c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = true
one_nat_gateway_per_az = false
enable_dns_hostnames = true
enable_dns_support = true
tags = module.project_config.tags
}
module "bastion_sg" {
source = "terraform-aws-modules/security-group/aws"
name = "bastion-service"
description = "Security group for …Run Code Online (Sandbox Code Playgroud) terraform terraform-provider-aws terraform0.12+ terraform-aws-modules
最近AWS发布了基于HTTPS的API网关(不是REST)。我们使用 Terraform 来管理 AWS 资源,并且我们有一个服务来创建 AWS HTTPS API 网关资源,存在一个安全问题,即我们允许任何 IP/系统调用 API,因此我们计划添加一个策略(资源策略)以限制仅访问特定 IP。对于 REST API 网关来说,实现这一点很容易,因为我们有aws_api_gateway_rest_api_policy资源来通过 Terraform 创建策略并将其附加到网关,但对于 HTTPS API 网关却无法实现同样的效果。我们使用aws_apigatewayv2_api创建 HTTPS 网关资源,但找不到附加策略的资源,或者在创建网关本身时没有指定策略的选项。如果您能了解如何将策略附加到基于 HTTPS 的 API,我们将不胜感激。谢谢。
amazon-web-services terraform aws-api-gateway terraform-provider-aws
请帮助理解如何创建这样的东西?
data "aws_iam_policy_document" "assume_role_policy" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ec2.amazonaws.com"]
}
}
dynamic "statement" {
for_each = var.assume_role_identities != [] ? [true] : []
content {
actions = ["sts:AssumeRole"]
principals {
type = "AWS"
identifiers = var.assume_role_identities
}
}
}
dynamic "statement" {
for_each = var.assume_role_services != [] ? [true] : []
content {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = var.assume_role_services
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码的问题是,如果我不指定任何应该具有访问权限的角色或服务,则会退出并出现没有主体的错误。是否可以在动态块上设置一些计数条件?或者如何解决它?
问题说明:
问题是,如果我只想传递某个值,它将无法工作,因为它会形成一个空值 …
我试图hosts在执行时从本地计算机中删除生成的 Ansible 库存文件terraform destroy。
当我运行时,terraform apply我用来provisioner "local-exec"创建hosts文件,稍后由部署期间调用的 ansible playbook 使用。
provisioner "local-exec" {
command = "echo master ansible_host=${element((aws_instance.kubeadm-node.*.public_ip),0)} >> hosts"
}
Run Code Online (Sandbox Code Playgroud)
hosts当我删除所有资源时是否可以确保文件被删除terraform destroy?hosts执行时删除文件的最简单方法是什么terraform destroy?
感谢您的帮助,如果我的解释不够清楚,请告诉我。