在我們的一個 AWS S3 存盤桶上啟用 WORM 后,terraform 不再允許我對其進行任何更改,因為它已經存在。
就背景關系而言,我們在 S3 中有一個遠程狀態,但這不是受影響的存盤桶,我們正在為我們的 s3 存盤桶使用 terraform-aws-modules/s3-bucket/aws 模塊。
我最初運行的命令是
terraform -chdir=infrastructure/wazuh_app/resources import -config=../resources -var-file=../config/stage/terraform.tfvars "module.wazuh_app.module.wazuh_log_archive.module.bucket.aws_s3_bucket.this[0]" [BUCKET NAME]
但是在運行時我收到了錯誤:
error creating S3 Bucket ([BUCKET NAME]): BucketAlreadyOwnedByYou: Your previous request to create the named bucket succeeded and you already own it.
因此,我將其從狀態中洗掉并嘗試運行上述命令和之前的命令重新匯入它:
terraform -chdir=infrastructure/wazuh_app/resources state rm module.wazuh_app.module.wazuh_log_archive.module.bucket.aws_s3_bucket.this[0]
但是,在嘗試再次應用更改后,我再次收到創建存盤桶問題的錯誤。
根據要求,這是在 wazuh_log_archive 級別使用的代碼:
module "bucket" {
source = "terraform-aws-modules/s3-bucket/aws"
version = "3.3.0"
bucket = "${var.name_prefix}-${var.log_bucket_name}"
acl = "private"
force_destroy = true
versioning = {
enabled = true
}
server_side_encryption_configuration = {
rule = {
bucket_key_enabled = true
apply_server_side_encryption_by_default = {
kms_master_key_id = module.kms_wazuh_archive_key.key_arn
sse_algorithm = "aws:kms"
}
}
}
lifecycle_rule = [
{
id = "[ID]"
enabled = true
expiration = {
days = var.s3_retention_period
}
}
]
}
resource "aws_s3_bucket_object_lock_configuration" "worm_configuration" {
bucket = module.bucket.s3_bucket_id
rule {
default_retention {
mode = "GOVERNANCE"
days = var.worm_retention
}
}
token = var.token_required ? data.aws_ssm_parameter.worm_token.value : null
}
data "aws_ssm_parameter" "worm_token" {
name = "/${var.name_prefix}-${var.log_bucket_name}/worm-token"
}
在父模塊中,它在此鏈中呼叫:
module "wazuh_log_archive" {
source = "[wazuh_log_archive SOURCE]"
log_bucket_name = var.log_bucket_name
name_prefix = var.name_prefix
namespace = var.namespace
retention_period = var.retention_period
s3_retention_period = var.s3_retention_period
worm_retention = var.worm_retention
token_required = var.token_required
depends_on = [
module.wazuh_shared_resources
]
}
module "wazuh_app" {
source = "[wazuh_app SOURCE]"
worm_retention = var.worm_retention
token_required = var.token_required
}
我很茫然。我知道我正在匯入正確的存盤桶,并且我知道我正在從狀態中洗掉正確的存盤桶,因為我已經使用 terraform apply 的輸出和狀態串列選項進行了驗證。
有人知道它可能是什么嗎?
uj5u.com熱心網友回復:
該問題不是進口問題。
在運行了一些測驗之后,我發現 terraform 每次運行應用程式時都會嘗試重新創建我的 S3 存盤桶。這沒有任何意義,因為 terraform 源代碼在首次部署和當前狀態之間沒有任何變化。
在瀏覽了一段時間的 terraform 輸出并嘗試在代碼庫的不同級別更改 terraform 之后,我發現了問題......
# module.wazuh_app.module.wazuh_log_archive.module.bucket.aws_s3_bucket.this[0] must be replaced
/- resource "aws_s3_bucket" "this" {
acceleration_status = (known after apply)
acl = (known after apply)
~ arn = "[BUCKET ARN]" -> (known after apply)
~ bucket_domain_name = "[BUCKET DOMAIN NAME]" -> (known after apply)
~ bucket_regional_domain_name = "[BUCKET REGIONAL DOMAIN NAME]" -> (known after apply)
force_destroy = true
~ hosted_zone_id = "[ID]" -> (known after apply)
~ id = "[BUCKET ID]" -> (known after apply)
~ object_lock_enabled = true -> false # forces replacement
policy = (known after apply)
~ region = "eu-west-1" -> (known after apply)
~ request_payer = "BucketOwner" -> (known after apply)
- tags = {} -> null
website_domain = (known after apply)
website_endpoint = (known after apply)
# (2 unchanged attributes hidden)
生成的大量 terraform 日志意味著我錯過了輸出中的一小行,這一行是:
~ object_lock_enabled = true -> false # forces replacement
aws_s3_bucket 模塊檔案沒有說明的是,一旦您將 WORM 令牌添加到存盤桶,您必須向模塊添加一個附加引數,以便它記住它在未來的部署中使用 WORM。但是,在將令牌與存盤桶關聯的部署中,此引數不是必需的。
這不僅沒有被提及,而且有點不合邏輯,因為存盤桶已為其定義了 object_lock_configuration,這是在初始重新部署時在現有存盤桶上啟用 WORM 的必需步驟。這種輕微的不一致非常令人沮喪。
總體結論是,我錯過了 terraform deploy 輸出中的一行,并在幾個小時的作業中付出了代價。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/497644.html
