ログ用のS3バケットを作成して、ALBのアクセスログを有効化しようとしたところ、S3の権限不十分でエラーが発生しました。
│ Error: modifying ELBv2 Load Balancer (arn:aws:elasticloadbalancing:ap-northeast-1:************:loadbalancer/app/alb-prod/fbbd3f2304ff9285) attributes: InvalidConfigurationRequest: Access Denied for bucket: logs-prod. Please check S3bucket permission
公式ドキュメントをみたら、普通にバケットポリシーの設定が漏れていました。
以下のTerraformコードでエラーを解消したので、参考になれば幸いです。
S3
バケット名logs-prod
とプレフィックスalb/alb-prod
を使用します。582318560864
は東京リージョンのELBのAWSアカウントIDです。<account-id>
を自身のAWSアカウントIDに置き換えて使用してください。
resource "aws_s3_bucket" "logs_prod" {
bucket = "logs-prod"
tags = {
Environment = "prod"
}
}
resource "aws_s3_bucket_policy" "logs_prod_policy" {
bucket = aws_s3_bucket.logs_prod.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::582318560864:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::logs-prod/alb/alb-prod/AWSLogs/<account-id>/*"
}
]
}
POLICY
}
ALB
access_logs
ブロックを追加して、有効化可否(enabled
)、バケット名(bucket
)、プレフィックス(prefix
)を設定します。
resource "aws_lb" "alb_prod" {
name = "alb-prod"
internal = false
load_balancer_type = "application"
security_groups = [var.security_group_elb_sg_id]
subnets = [var.subnet_public_1a_id, var.subnet_public_1c_id]
enable_deletion_protection = true
preserve_host_header = true
access_logs {
enabled = true
bucket = "logs-prod"
prefix = "alb/alb-prod"
}
tags = {
Environment = "prod"
}
}
この設定を適用することで、ALBからS3バケットへのログの書き込みが正しく行われるようになりました。