Terraform: настройка ведения журнала из AWS LoadBalancer в корзину S3

У меня есть aws_lb, который я хочу зарегистрировать в корзине S3.

Что я безуспешно пытался сделать:

data "aws_elb_service_account" "main" {}

data "aws_iam_policy_document" "bucket_policy" {
  statement {
    sid       = ""
    actions   = ["s3:PutObject"]
    resources = ["arn:aws:s3:::my-bucket/*"]

    principals {
      type        = "AWS"
      identifiers = ["${data.aws_elb_service_account.main.arn}"]
    }
  }
}

Я также пробовал это:

resource "aws_iam_role" "lb-logs-role" {
  name = "lb-logs-role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "elasticloadbalancing.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF

  tags = {
    Name = "lb-logs-role"
    Environment  = terraform.workspace
    Management   = "Managed by Terraform"
  }
}

resource "aws_iam_role_policy" "s3-logs-access" {
  name = "s3-logs-access"
  role = aws_iam_role.lb-logs-role.id

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
EOF
}

Это ошибка, которую я вижу:

Error: Failure configuring LB attributes: InvalidConfigurationRequest: Access Denied for bucket: my-bucket. Please check S3bucket permission
        status code: 400, request id: 5b629210-9738-11e9-bcc6-6f3b4f22bf28

  on modules/tableau-linux/lb.tf line 1, in resource "aws_lb" "main":
   1: resource "aws_lb" "main" {

Любые идеи?


person Joseph Tura    schedule 25.06.2019    source источник
comment
Пожалуйста, добавьте ошибки, с которыми вы столкнулись при редактировании вопроса.   -  person Aniket Kulkarni    schedule 25.06.2019
comment
Возможный дубликат проблемы с разрешениями Terraform ELB S3   -  person ydaetskcoR    schedule 25.06.2019
comment
Я добавил ошибку. Не знаю, насколько это полезно.   -  person Joseph Tura    schedule 25.06.2019
comment
Я пробовал код из возможного дубликата, но безрезультатно. Не знаю, имеет ли это значение, но в этом вопросе используется aws_elb, а не aws_lb.   -  person Joseph Tura    schedule 25.06.2019
comment
@JosephTura, пожалуйста, проверьте, я тестирую версию Terraform Terraform v0.12.1   -  person Adiii    schedule 26.06.2019


Ответы (2)


Похоже, что API запросит ACL ведра, чтобы узнать, есть ли у него разрешение, и заполнит исходную структуру папок, поэтому, даже если aws_elb_service_account имеет разрешения на putObject в ведре, вызов API завершится ошибкой. Эта политика — это то, что создает веб-консоль AWS, когда она создает для вас корзину S3, и она решила ее для меня.

data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
data "aws_elb_service_account" "main" {}
resource "aws_s3_bucket_policy" "lb-bucket-policy" {
  bucket = aws_s3_bucket.lb-log-storage-s3.id

  policy = <<POLICY
{
    "Id": "Policy",
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "${data.aws_elb_service_account.main.arn}"
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "${aws_s3_bucket.lb-log-storage-s3.arn}/AWSLogs/${data.aws_caller_identity.current.account_id}/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "${aws_s3_bucket.lb-log-storage-s3.arn}/AWSLogs/${data.aws_caller_identity.current.account_id}/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": [
                "s3:GetBucketAcl"
            ],
            "Resource": "${aws_s3_bucket.lb-log-storage-s3.arn}"
        }
    ]
}
POLICY
}
person SuperSaiyen    schedule 18.09.2019

Кажется, проблема связана с вашей политикой, но вы можете попробовать мой код, используя aws_lb. Вот полная конфигурация для запуска в LB в VPC по умолчанию и создания корзины с именем test-bucket-1-unique-name, политики и LB с именем test-http-lb. Наряду с комментируемой записью SG и Route53.

# Creating Load Balancer
resource "aws_lb" "httplb" {
  name                       = "test-http-lb"
  internal                   = false
  load_balancer_type         = "application"
  security_groups            = ["${aws_security_group.lbsg.id}"]
  subnets                       = ["subnet-99fdf8e0", "subnet-902b0ddb"]
  enable_deletion_protection = false
  access_logs {
    bucket  = "${aws_s3_bucket.bucket.bucket}"
    prefix  = "http-lb"
    enabled = true
  }
  tags = {
    Environment = "test-http"
  }
}


# Creating Security Groups for Load Balancer
resource "aws_security_group" "lbsg" {
  name        = "test-loadbalancer-sg"
  description = "test-Allow LB traffic"
  tags = {
    Name = "test-SG-Balancer"
  }

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
    description = "HTTP"
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}










#uncomment this if you want to add route53 record
# resource "aws_route53_record" "web" {
#   zone_id = "${data.aws_route53_zone.primary.zone_id}"
#   name    = "${var.env_prefix_name}.ironman.co
#   type    = "A"

#   alias {
#     name                   = "${aws_lb.httplb.dns_name}"
#     zone_id                = "${aws_lb.httplb.zone_id}"
#     evaluate_target_health = true
#   }
# }




data "aws_elb_service_account" "main" {}

# Creating policy on S3, for lb to write
resource "aws_s3_bucket_policy" "lb-bucket-policy" {
  bucket = "${aws_s3_bucket.bucket.id}"

  policy = <<POLICY
{
  "Id": "testPolicy1561031527701",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "testStmt1561031516716",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::test-bucket-1-for-lb-logs/http-lb/*",
      "Principal": {
        "AWS": [
           "${data.aws_elb_service_account.main.arn}"
        ]
      }
    }
  ]
}
POLICY
}

resource "aws_s3_bucket" "bucket" {
  bucket = "test-bucket-1-for-lb-logs"
  acl    = "private"
  region = "us-west-2"

  versioning {
    enabled = false
  }
  force_destroy = true


}

Затем перейдите в корзину S3 и проверьте TestFile. введите здесь описание изображения Вот логи из terraform

введите здесь описание изображения

person Adiii    schedule 26.06.2019
comment
@ Джозеф, ты пробовал это? - person Adiii; 29.06.2019