Tengo un problema al usar Terraform (v0.9.2) al agregar servicios a un ELB (estoy usando: https://github.com/segmentio/stack/blob/master/s3-logs/main.tf ).
Cuando ejecuto terraform apply me sale este error:
* module.solr.module.elb.aws_elb.main: 1 error(s) occurred: * aws_elb.main: Failure configuring ELB attributes: InvalidConfigurationRequest: Access Denied for bucket: my-service- logs. Please check S3bucket permission status code: 409, request id: xxxxxxxxxx-xxxx-xxxx-xxxxxxxxxMi servicio se ve así:
module "solr" { source = "github.com/segmentio/stack/service" name = "${var.prefix}-${terraform.env}-solr" environment = "${terraform.env}" image = "123456789876.dkr.ecr.eu-west-2.amazonaws.com/my-docker-image" subnet_ids = "${element(split(",", module.vpc_subnets.private_subnets_id), 3)}" security_groups = "${module.security.apache_solr_group}" port = "8983" cluster = "${module.ecs-cluster.name}" log_bucket = "${module.s3_logs.id}" iam_role = "${aws_iam_instance_profile.ecs.id}" dns_name = "" zone_id = "${var.route53_zone_id}" }Mi depósito de s3-logs se ve así:
module "s3_logs" { source = "github.com/segmentio/stack/s3-logs" name = "${var.prefix}" environment = "${terraform.env}" account_id = "123456789876" }Revisé S3 y la política del depósito se ve así:
{ "Version": "2012-10-17", "Id": "log-bucket-policy", "Statement": [ { "Sid": "log-bucket-policy", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789876:root" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::my-service-logs/*" } ] }Por lo que puedo ver, ELB debería tener acceso al depósito S3 para almacenar los registros (se está ejecutando en la misma cuenta de AWS).
El cubo y el ELB están todos en eu-west-2 .
Cualquier idea sobre cuál podría ser el problema sería muy apreciada.
Los documentos para los registros de acceso de ELB dicen que desea permitir que una cuenta de Amazon específica pueda escribir en S3, no en su cuenta.
Como tal, quieres algo como:
{ "Id": "Policy1429136655940", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1429136633762", "Action": [ "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::my-loadbalancer-logs/my-app/AWSLogs/123456789012/*", "Principal": { "AWS": [ "652711504416" ] } } ] }En Terraform, puede utilizar la fuente de datos aws_elb_service_account para obtener automáticamente el ID de cuenta utilizado para escribir registros, como se puede ver en el ejemplo de los documentos:
data "aws_elb_service_account" "main" {} resource "aws_s3_bucket" "elb_logs" { bucket = "my-elb-tf-test-bucket" acl = "private" policy = <<POLICY { "Id": "Policy", "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::my-elb-tf-test-bucket/AWSLogs/*", "Principal": { "AWS": [ "${data.aws_elb_service_account.main.arn}" ] } } ] } POLICY } resource "aws_elb" "bar" { name = "my-foobar-terraform-elb" availability_zones = ["us-west-2a"] access_logs { bucket = "${aws_s3_bucket.elb_logs.bucket}" interval = 5 } listener { instance_port = 8000 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } }Incluso cuando tenía todo por los documentos, seguía recibiendo el error "Acceso denegado para el depósito". Quitar el cifrado del cubo funcionó para mí.
En la política de depósitos, el número de cuenta NO debe ser el suyo. En cambio, pertenece a AWS y, para cada región, los números de cuenta que debe usar en su política de depósito se enumeran en: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-access-logs.html #adjuntar-política-de-depósito
Por ejemplo, para la región us-east-1 , el número de cuenta es 127311923021 .
Aunque la pregunta es sobre Terraform, publico un fragmento de CloudFormation que creó un depósito para que el acceso de ELB registre su política de depósito:
MyAccessLogsBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain MyAllowELBAccessBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref MyAccessLogsBucket PolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: AWS: "arn:aws:iam::127311923021:root" Action: - "s3:PutObject" Resource: !Sub "arn:aws:s3:::${MyAccessLogsBucket}/AWSLogs/*" En principio, se usa 127311923021 ya que este es el número de cuenta de AWS que debe usarse para el número de cuenta en us-east-1 .