我正在尝试正确设置我的基础设施,没有密码或密钥。AWS RDS 可以选择这样做,让用户(应用程序)能够使用生成的令牌进行身份验证。
但是,在文档中,其中一个步骤(这一步)需要在 Postgres 数据库中运行查询以创建用户并授予他特定的权限:
CREATE USER test_rds WITH LOGIN;
GRANT rds_iam TO test_rds;
Run Code Online (Sandbox Code Playgroud)
我想使用 Terraform 配置整个堆栈。在 RDS 实例化之后,我查找了一些“技巧”来运行查询(这里),使用以下任一方法:
resource "null_resource" "db_setup" {
depends_on = ["aws_db_instance.your_database_instance", "aws_security_group.sg_allowing_external_access"]
provisioner "local-exec" {
// run shell commands to manually psql into the db
Run Code Online (Sandbox Code Playgroud)
或者:
resource "aws_instance" "web" {
provisioner "remote-exec" {
inline = [
// run shell commands to manually psql into the db
Run Code Online (Sandbox Code Playgroud)
但是它们都需要创建主密码并以某种方式将其传递到“脚本”中。
是否可以使用 Terraform 干净利落地做到这一点,而不会传递硬编码密码?
我希望配置数据库并仅启用具有正确访问权限的特定 EC2/ECS 实例,而我的 git 存储库中没有任何密码。
postgresql amazon-web-services amazon-rds terraform infrastructure-as-code
这里是 Terraform 新手。我这里有一个 ECS 计划任务的代码。每当我更改此设置并应用更改时,任务定义的第一个版本就会在 ECS 任务中设置。所以我尝试向其中添加生命周期方法。
resource "aws_cloudwatch_event_target" "sqs" {
rule = aws_cloudwatch_event_rule.sqs.name
target_id = local.namespace
arn = aws_ecs_cluster.app.arn
role_arn = aws_iam_role.ecsRole.arn
input = "{}"
ecs_target {
task_count = 1
task_definition_arn = aws_ecs_task_definition.sqs.arn
launch_type = "FARGATE"
platform_version = "LATEST"
network_configuration {
security_groups = [aws_security_group.nsg_task.id]
subnets = split(",", var.private_subnets)
}
}
}
Run Code Online (Sandbox Code Playgroud)
尝试过:
resource "aws_cloudwatch_event_target" "sqs" {
rule = aws_cloudwatch_event_rule.sqs.name
target_id = local.namespace
arn = aws_ecs_cluster.app.arn
role_arn = aws_iam_role.ecsRole.arn
input = "{}"
ecs_target {
task_count = 1
task_definition_arn = aws_ecs_task_definition.sqs.arn …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-ecs terraform terraform-provider-aws infrastructure-as-code
最近,我开始在 Terraform 配置中使用每个环境的工作空间。我最终拥有了三个工作区:开发、登台和生产。但由于历史原因,我的默认工作区仍然包含过时的 tfstate。
将其“重置”为默认状态的正确方法是什么?就像里面什么都没有一样。
实现此目的的一种方法是terraform state rm为每个资源手动执行。但这样一来,我就会接到数百个这样的电话。有某种terraform state reset类似物吗?
我正在尝试将 Secret 作为每个 CDK 的整数值(端口号)获取,以便创建另一个资源。基本上,当我需要字符串参数的字符串值时,一切都工作正常,但是当我尝试将字符串解析为 int 以提供数字参数时,它不再工作。问题是 CDK 生成这些值的引用,并且无法将其转换为数字值。问题是:有没有办法以数字形式检索秘密值?
这里有一些代码片段:
SecretManager 对象:
const secret = secretsmanager.Secret.fromSecretAttributes(this, "SecretId", {
secretCompleteArn: someValidSecretArn
});
Run Code Online (Sandbox Code Playgroud)
工作正常:
host: secret.secretValueFromJson('host').toString()
Run Code Online (Sandbox Code Playgroud)
不起作用,因为参数需要是数字值:
port: secret.secretValueFromJson('port').toString()
Run Code Online (Sandbox Code Playgroud)
不工作,因为端口为空(它不是!),基本上无法解析引用:
port: parseInt(secret.secretValueFromJson('port').toString())
Run Code Online (Sandbox Code Playgroud)
不起作用,与上面相同:
port: +secret.secretValueFromJson('port').toString()
Run Code Online (Sandbox Code Playgroud) amazon-web-services typescript aws-secrets-manager aws-cdk infrastructure-as-code
我正在使用 Terraform 进行 AWS 多账户设置。我有一个主账户,它创建了几个子账户,在子账户中我引用了主账户的远程状态来检索输出值。
terraform plan测试 main.tf 中此配置的命令失败:
terraform {
required_version = ">= 0.12.0"
backend "s3" {
bucket = "bucketname"
key = "statekey.tfstate"
region = "us-east-1"
}
}
provider "aws" {
region = "us-east-1"
version = "~> 2.7"
}
data "aws_region" "current" {}
data "terraform_remote_state" "common" {
backend = "s3"
config {
bucket = "anotherbucket"
key = "master.tfstate"
}
}
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
? test terraform plan
Error: Unsupported block type
on main.tf line 20, in data "terraform_remote_state" "common":
20: …Run Code Online (Sandbox Code Playgroud) 我们的镜像具有应该在 docker 运行期间定义的环境变量,知道如何将此变量添加到 cloudformation 文件中。我们目前有类似的东西:
Task:
Type: AWS::ECS::TaskDefinition
Properties:
Family: testenv
Cpu: 256
Memory: 512
NetworkMode:
RequiresCompatibilities:
- FARGATE
ExecutionRoleArn: !ImportValue ECSTaskExecutionRole
ContainerDefinitions:
- Name: bonalds
Image: gcr.io/zonalds-21/id-me:latest // image comes from gcr
Cpu: 256
Memory: 512
PortMappings:
- ContainerPort: 4567
Protocol: tcp
LogConfiguration:
LogDriver:
Options:
awslogs-group: 'zonalds'
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: 'routme'
Run Code Online (Sandbox Code Playgroud)
我似乎在 AWS 文档中找不到任何信息,添加环境变量的最佳方法是什么?
aws-cloudformation docker-compose google-cloud-functions infrastructure-as-code
有没有办法从位于不同模块的不同 main.tf 文件中的另一个对象引用 id 值?
如果两个资源或对象位于同一个文件中,则只需执行此操作
resource "aws_s3_bucket" "log_bucket" {
bucket = "my-tf-log-bucket"
acl = "log-delivery-write"
}
resource "aws_s3_bucket" "b" {
bucket = "my-tf-test-bucket"
acl = "private"
logging {
target_bucket = aws_s3_bucket.log_bucket.id
target_prefix = "log/"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将用于日志记录的target_bucket分配给bucket的idresource "aws_s3_bucket"
现在假设我有两个名为log_module和的文件夹s3_module及其各自的main.tf文件。
main.tflog_module 内部包含
resource "aws_s3_bucket" "log_bucket" {
bucket = "my-tf-log-bucket"
acl = "log-delivery-write"
}
Run Code Online (Sandbox Code Playgroud)
main.tfs3_module 内部包含
resource "aws_s3_bucket" "b" {
bucket = "my-tf-test-bucket"
acl = "private"
logging {
target_bucket = "target-bucket"
target_prefix …Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services terraform infrastructure-as-code
我想使用 Ansible playbook 在 docker 容器内设置远程环境。该剧本将从 gitlab-ci 运行,其中包含我在 Gitlab CI/CD 配置中设置的变量。我怎样才能做到这一点?
这是我想使用的模板。如何设置CI/CD 变量中的user_id和?password
tasks:
- name: Run XYZ Container
docker_container:
name: XYZ
restart_policy: on-failure
image: xxxxxxxxxxx
container_default_behavior: "compatibility"
env:
USER_ID= $USER_ID
PASSWORD= $PASSWORD
Run Code Online (Sandbox Code Playgroud) 我正在尝试更新 hashcorp/aws 提供商版本。
我添加了包含以下内容的 terraform.tf 文件:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
Run Code Online (Sandbox Code Playgroud)
后来我尝试使用以下方法更新模块:
terraform init -upgrade
Run Code Online (Sandbox Code Playgroud)
然而,我已经开始明白:
Could not retrieve the list of available versions for provider hashicorp/aws: no available releases match the given constraints >= 2.0.0, ~> 3.27, ~> 4.0
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题呢?
对任何 beta 参数定义的任何 Google Cloud Platform (GCP) 资源进行地形改造都需要提供google-beta程序。是否应该google-beta使用提供者来代替或与提供者一起使用google提供程序一起使用?
换句话说,假设$GKE_CLUSTER_NAMEGCP 项目中存在某个 Google Kubernetes Engine (GKE) 集群$GCP_PROJECT_NAME某个 Google Kubernetes Engine (GKE) 集群:
gcloud container clusters list \\\n--format="value(name)" \\\n--project=$GCP_PROJECT_NAME\n\n#=>\n\n. . .\n$GKE_CLUSTER_NAME\n. . .\nRun Code Online (Sandbox Code Playgroud)\n启用配置连接器后:
\ngcloud container clusters describe $GKE_CLUSTER_NAME \\\n--format=\xe2\x80\x9cvalue(addonsConfig.configConnectorConfig.enabled)\xe2\x80\x9d \\\n--zone=$GKE_CLUSTER_ZONE\n\n#=>\n\nTrue\nRun Code Online (Sandbox Code Playgroud)\nTerraforming$GKE_CLUSTER_NAME需要一个google_container_cluster资源定义,container_cluster.tf其中包括config_connector_config参数(在addons_config块内;更多信息请参见此处)和provider参数(官方参考文档中缺少):
resource "google_container_cluster" "test" {\n addons_config {\n config_connector_config {\n enabled …Run Code Online (Sandbox Code Playgroud) google-cloud-platform google-kubernetes-engine terraform terraform-provider-gcp infrastructure-as-code
terraform ×7
devops ×2
amazon-ecs ×1
amazon-rds ×1
amazon-s3 ×1
ansible ×1
aws-cdk ×1
cicd ×1
gitlab-ci ×1
postgresql ×1
typescript ×1