Amazon cloudformation terraform tf文件或模块能否自动使资源过期?

Amazon cloudformation terraform tf文件或模块能否自动使资源过期?,amazon-cloudformation,terraform,terraform-provider-aws,Amazon Cloudformation,Terraform,Terraform Provider Aws,在cloudformation中,您可以在运行删除堆栈的命令的堆栈上设置TTL: 如何在TF文件中执行此操作 或者我可以有一个脚本来获取tf文件(状态文件)的创建时间,将其与当前时间进行比较并进行销毁?这可能也行Terraform不跟踪这些生命周期事件。状态文件甚至没有更新时间的相关数据(后端拥有的元数据除外,如文件创建/更新时间)。我建议您自己跟踪这些数据,并在terraform之外对生命周期进行建模 下面是一个如何使用来管理此生命周期以保持此状态的示例 首先,我为“堆栈”(借用CloudFo

在cloudformation中,您可以在运行删除堆栈的命令的堆栈上设置TTL:

如何在TF文件中执行此操作


或者我可以有一个脚本来获取tf文件(状态文件)的创建时间,将其与当前时间进行比较并进行销毁?这可能也行

Terraform不跟踪这些生命周期事件。状态文件甚至没有更新时间的相关数据(后端拥有的元数据除外,如文件创建/更新时间)。我建议您自己跟踪这些数据,并在terraform之外对生命周期进行建模

下面是一个如何使用来管理此生命周期以保持此状态的示例

首先,我为“堆栈”(借用CloudFormation术语)生成一个唯一标识符,并将创建时间存储在SSM参数存储中。我们将此UUID传递给Terraform,以进行标记和后端配置

#!/bin/bash
set -e

UUID=$(uuidgen)
TIMESTAMP=$(date +%s)
SSM_PARAMETER_STORE_NAME="/terraform/created_at/${UUID}"
<configure terraform backend config>
<terraform apply step>
aws ssm put-parameter --name "$SSM_PARAMETER_STORE_NAME" --value "$TIMESTAMP" --type String > /dev/null
echo $UUID

然后,您可以自动定期对
/terraform/created.\u at/*

中的每个UUID执行该检查。我不认为这样做:terraform destroy-auto approve-var“UUID=${1}”。你能把terraform直接指向一个州文件并让它像那样销毁吗?我认为这不是因为你需要先进行terraform初始化,这意味着你需要在某个地方的tf文件中配置后端,并将其初始化到正确的状态文件,这是一个很大的混乱。事实上,在我的测试环境中就是这样工作的。根据您使用的后端,您的后端会有所不同。例如,您的后端可以这样配置:
terraforminit-backend-config'bucket=${bucket}'-backend-config'region=${region}'-backend-config'dynamodb_table=${table}'-backend-config'key=${UUID}.state'
,之后您可以
terraform apply-var'UUID=${UUID}“
使用
UUID
var打开堆栈以消除需要名称的资源的歧义(如果您选择)。要点是使用管理1)堆栈名称的代码在Terraform中包装您需要执行的任何操作,以便稍后引用,2)记录创建时间,和3)可以定期调用,以将当前时间与创建时间进行比较,如果超过阈值,则销毁。这也不起作用,请在空目录中运行terraform init命令,terraform不会下拉状态或任何内容。它成功了,但与实际状态文件断开了连接。如果在该命令之后运行“地形状态列表”,您将一无所获。使init工作的唯一方法是使用一个实际的tf文件——您还需要指定“provider”。这意味着动态生成tf文件并写入磁盘(如果有更好的方法,请告诉我)。我的观点是必须编写脚本,这是非常糟糕的。如果我可以直接指向一个状态文件(都带有命令行参数)并销毁它,这可能会起作用,但似乎不可能。CloudFormation本身在某个特定时间没有自终止的方法。该链接显示了一个Cloudformation模板,该模板创建了一个实例,该实例使用
at
运行脚本在特定时间删除堆栈。您可以对Terraform使用相同的原则,只要您的Terraform配置创建了一个具有权限和配置的实例,就可以做到这一点。
#!/bin/bash

usage(){
  echo "Performs terraform destroy if a terrafrom 'stack' was created at least <threshold> seconds ago"
  echo "Usage: $0 UUID threshold"
  exit 1
}

validate_args(){
  [[ -z "$1" ]] && { echo "No UUID passed, exiting" ; usage; exit 1; }
  [[ -z "$2" ]] && { echo "No Threshold passed, exiting" ; usage; exit 1; }
  echo "Args validated"
}

check_time(){
  SSM_PARAMETER_STORE_NAME=$1
  THRESHOLD=$2
  NOW=$(date +%s)

  CREATED_AT=$(aws ssm get-parameter --name "$SSM_PARAMETER_STORE_NAME" | jq -r .Parameter.Value)
  if [[ $(($NOW - $CREATED_AT)) > $THRESHOLD ]]; then
     echo "Threshold not met, exiting"
     exit 1
  fi
  echo "Threshold met"
}

perform_tf_destroy(){
  <configure terraform backend config>
  <terraform destroy step>
  aws ssm delete-parameter --name "$SSM_PARAMETER_STORE_NAME"
}

validate_args $1 $2
SSM_PARAMETER_STORE_NAME="/terraform/created_at/${1}"
THRESHOLD=$2
check_time $SSM_PARAMETER_STORE_NAME $THRESHOLD
perform_tf_destroy