AWS 支持服务账户的 IAM 角色 (IRSA),允许集群操作员将 AWS IAM 角色映射到 Kubernetes 服务账户。
为此,必须在 EKS 集群中创建一个iamserviceaccount :
eksctl create iamserviceaccount \
--name <AUTOSCALER_NAME> \
--namespace kube-system \
--cluster <CLUSTER_NAME> \
--attach-policy-arn <POLICY_ARN> \
--approve \
--override-existing-serviceaccounts
Run Code Online (Sandbox Code Playgroud)
问题是我不想使用上面的eksctl命令,因为我想使用terraform.
eksctl 命令除了创建服务帐户之外还执行其他操作吗?如果它只创建一个服务帐户,那么YAML它的代表是什么?
amazon-web-services amazon-iam kubernetes terraform amazon-eks
我正在尝试使用我的私人 git 存储库作为 terraform 模块的源。
ssh 公钥已复制到 github。
尝试了以下选项作为源,但没有任何效果:
任何帮助是极大的赞赏。
参考以下链接上的 Private Github repos 部分也没有帮助。 https://github.com/alibaba/terraform-provider/blob/master/vendor/github.com/hashicorp/terraform/website/docs/modules/sources.html.markdown
私有 GitHub 存储库 如果您需要 Terraform 从私有 GitHub 存储库获取模块,则必须向 Terraform 提供凭据,以作为对这些存储库具有读取访问权限的用户进行身份验证。
如果您仅在本地计算机上运行 Terraform,则可以将模块源指定为 SSH URI(如 git@github.com:hashicorp/example.git),Terraform 将使用您的默认 SSH 密钥进行身份验证。
如果您使用 Terraform Enterprise,则可以使用 SSH URI。您需要向您的组织添加 SSH 私钥,并将其分配给从私有存储库获取模块的任何工作区。请参阅有关克隆模块的 SSH 密钥的 Terraform Enterprise 文档。
如果您需要在 CI Worker 等远程计算机上运行 Terraform,则需要将 SSH 密钥写入磁盘并在 Worker 的配置过程中适当设置 GIT_SSH_COMMAND 环境变量,或者创建一个对存储库具有读取权限的 GitHub 计算机用户有问题并将其凭据嵌入到模块的源参数中: module "private-infra" { source = "git:: https://MACHINE-USER:MACHINE-PASS@github.com/org/privatemodules//modules/foo " } 请注意,Terraform 不支持在模块的源参数中进行插值,因此如果使用此方法,您必须对计算机用户名和密码进行硬编码。
我使用 Terraform 创建了 AzDo 存储库。但是重命名存储库而不删除它的最佳方法是什么?为此,我找到了一个命令“terraform state mv”。如果有更好的方法请告诉我。
\n目前,当我使用 Terraform state mv 命令时,出现以下错误
\n terraform state mv "module.azdo-module.azuredevops_git_repository[\\"repo1\\"]" "module.azdo-module.azuredevops_project.azuredevops_git_repository[\\"repo2\\"]"\nRun Code Online (Sandbox Code Playgroud)\n出现以下错误
\n Error: Invalid address\n \xe2\x94\x82 \n \xe2\x94\x82 on line 1:\n \xe2\x94\x82 (source code not available)\n \xe2\x94\x82 \n \xe2\x94\x82 A resource name is required.\nRun Code Online (Sandbox Code Playgroud)\n 我需要将我的cloudwatch日志发送到日志分析服务.
现在,我正在尝试使用Terraform(角色/策略,安全组,cloudwatch日志组,lambda以及从日志组触发lambda)自动执行所有这些操作.
但我无法弄清楚如何使用TF来配置AWS以从cloudwatch日志中触发lambda.
我可以通过执行以下操作手动将两个TF资源链接在一起(在Lambda Web控制台UI中):
完成后,lambda将显示在订阅列中的cloudwatch日志控制台上 - 显示为"Lambda(cloudwatch-sumologic-lambda)".
我尝试使用以下TF资源创建订阅:
resource "aws_cloudwatch_log_subscription_filter" "cloudwatch-sumologic-lambda-subscription" {
name = "cloudwatch-sumologic-lambda-subscription"
role_arn = "${aws_iam_role.jordi-waf-cloudwatch-lambda-role.arn}"
log_group_name = "${aws_cloudwatch_log_group.jordi-waf-int-app-loggroup.name}"
filter_pattern = "logtype test"
destination_arn = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}"
}
Run Code Online (Sandbox Code Playgroud)
但它失败了:
aws_cloudwatch_log_subscription_filter.cloudwatch-sumologic-lambda-subscription:InvalidParameterException:供应商lambda的destinationArn不能与roleArn一起使用
我找到了关于为预定事件设置类似事情的答案,但这似乎与我上面描述的控制台操作没有相同(控制台UI方法不会创建我能看到的事件/规则) ).
有人能给我一个关于我做错的指针吗?
我在.tf多个应用程序通用的文件中定义了资源。我通过.tfvars文件填充了许多字段。我需要完全基于.tfvars.
例如,如果我有这样的资源:
resource "cloudflare_record" "record" {
zone_id = "${data.cloudflare_zones.domain.zones[0].id}"
name = "${var.subdomain}"
value = "${var.origin_server}"
type = "CNAME"
ttl = 1
proxied = true
}
Run Code Online (Sandbox Code Playgroud)
但是后来我cloudflare = false在我的.tfvars文件中声明了类似的东西,我希望能够做这样的事情:
if var.cloudflare {
resource "cloudflare_record" "record" {
zone_id = "${data.cloudflare_zones.domain.zones[0].id}"
name = "${var.subdomain}"
value = "${var.origin_server}"
type = "CNAME"
ttl = 1
proxied = true
}
}
Run Code Online (Sandbox Code Playgroud)
我看过动态块,但看起来您只能使用它们来编辑资源中的字段和块。我需要能够忽略整个资源。
我想删除使用 terraform 创建的非空 s3 存储桶。我也使用了force_destroy=true选项,但我仍然明白
BucketNotEmpty: The bucket you tried to delete is not empty
status code: 409, request id: xxxx, host id: xxxxxxx
Run Code Online (Sandbox Code Playgroud)
存储桶也是使用force_destroy选项创建的:
resource "aws_s3_bucket" "pipelineartifactstore" {
bucket = "${var.prefix}-${var.namespace}-${var.stage}-pipeline-artifactstore"
acl = "private"
force_destroy = true
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
tags = var.default_tags
}
Run Code Online (Sandbox Code Playgroud) 在尝试创建$disconnect为 API 网关命名的路由键时,我运行下面的代码片段,同时var.route_name应该收到字符串“disconnect”:
resource "aws_apigatewayv2_route" "route" {
api_id = var.apigw_api.id
route_key = "$${var.route_name}"
# more stuff...
}
Run Code Online (Sandbox Code Playgroud)
但它并没有正确地转义它。我找不到正确的方法来发出 a $,后跟var.route_names 的内容。
怎么做?
我开发了一个 terraform 脚本来在 GKE 上创建一个 k8 集群。
成功创建集群后,我有一组要应用于 k8 集群的 yaml 文件。
如何在我的 terraform 脚本中调用以下命令?
kubectl create <.yaml>
Run Code Online (Sandbox Code Playgroud) 如果这看起来像是一个微不足道的问题,我深表歉意,但是当我通常运行 terraform plan 或 terraform apply 时,您会在有关将创建、更改或销毁哪些资源的信息末尾得到一个转储。这很棒!
但是,您可能会注意到,有时资源的输出超出了终端缓冲区,因此我看不到所有正在更改的资源。
那么我如何将这些确切的信息转储到可读文件中,以便我可以查看将要更改的所有内容?
免责声明 - 它不是terraform plan -out=tfplan,因为这会创建一个不可读的文件。
这里有人有什么建议吗?我还尝试将 stdout 写入文件,但这没有显示我需要的资源的完整转储。
我正在学习地形。我想在“计划”阶段打印变量的值。所以我找到了该怎么做。似乎我在这里做错了什么......
在变量.tf中:....
variable "VMCount" {
description = "How many VMs do you want to start with (number)? default=1 max=5"
type = number
}
Run Code Online (Sandbox Code Playgroud)
在 main.tf 中
output "VMCount" {
value = "${var.VMCount > 2 && var.VMCount < 6 ? var.VMCount : 2}"
}
Run Code Online (Sandbox Code Playgroud)
之后我运行 terraform plan 并且条件似乎工作正常(它创建了正确数量的虚拟机)
但变量输出还没有到来。为什么?
$ terraform output
VMC = 56
Run Code Online (Sandbox Code Playgroud)
VMC 可能来自之前的一些尝试(我尝试了几件事)。
如何打印用户输入的值(变量)?
谢谢。
terraform ×10
kubernetes ×2
amazon-eks ×1
amazon-iam ×1
amazon-s3 ×1
azure-devops ×1
git ×1
github ×1
hcl ×1
sumologic ×1