Ресурс: aws_s3_bucket_public_access_block жалуется на корневой модуль

#terraform #terraform-provider-aws

#terraform #terraform-provider-aws

Вопрос:

 # TF Module to declare S3

resource "aws_kms_key" "lake_s3bucket_key" {
  description             = "This key is used to encrypt bucket objects"
  deletion_window_in_days = 30
}

resource "aws_s3_bucket" "log_bucket" {
  bucket = "test-log-bucket"
  acl    = "log-delivery-write"
}


# Data Lake bucket 
resource "aws_s3_bucket" "lake_s3bucket" {
  bucket = "ingestraw"
  acl    = "private"

  tags = {
    Name        = "s3bucket"
    Environment = "prod"
  }

  versioning {
    enabled = false
  }

  logging {
    target_bucket = aws_s3_bucket.log_bucket.id 
    target_prefix = "log/"
  }

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        kms_master_key_id = aws_kms_key.lake_s3bucket_key.arn
        sse_algorithm     = "aws:kms"
      }
    }
  }
}

# S3 bucket-level Public Access Block configuration
resource "aws_s3_bucket_public_access_block" "lake_s3bucket" {
  bucket = aws_s3_bucket.ingestraw.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

 

Терраформирование при выполнении «плана терраформирования» выдает ошибку ниже:

Ошибка: Ссылка на необъявленный ресурс

на main_s3.tf строка 45, в ресурсе «aws_s3_bucket_public_access_block» «lake_s3bucket»: 45: bucket = aws_s3_bucket.ingestraw.id

Управляемый ресурс «aws_s3_bucket» «ingestraw» не был объявлен в корневом модуле.

Я новичок в terraform и, следовательно, не могу понять, что происходит не так, почему он жалуется на корневой модуль. Я использую Terraform 3.20.

Комментарии:

1. У вас нет вызванного ресурса aws_s3_bucket.ingestraw . Вместо этого этот ресурс вызывается aws_s3_bucket.lake_s3bucket и определяется строкой: resource "aws_s3_bucket" "lake_s3bucket" {

2. Хорошо, спасибо, этот совет сработал. Итак, для полного понимания я должен использовать адресацию ресурсов, как указано в ссылке, вместо использования фактического имени корзины? что для меня имеет смысл( terraform.io/docs/internals/resource-addressing.html )

3. Да. Terraform всегда ссылается на ресурсы с помощью необязательных имен модулей (потенциально вложенных), типа ресурса, а затем имени ресурса.