ALBのアクセスログをS3バケットへ保存するようにTerraform実行したら「権限がないよ」と怒られた件
|
ALBのアクセスログをS3のバケットに保存できるようにしたかったのですが、Terraformを実行した際に下記のエラーが発生し、数刻悩まされました。
Error: Failure configuring LB attributes: InvalidConfigurationRequest: Access Denied for bucket: hogehoge-alb-log. Please check S3bucket permission
status code: 400, request id: b5a93fcd-a022-4e82-9fc1-a43367962638
on alb.tf line 8, in resource "aws_lb" "example":
8: resource "aws_lb" "example" {
アカウントIDの指定を間違えていただけだったのですが、またハマるかもしれないのでメモを残します。
パーミッションエラーとなっていた原因
ALBのログを保存するためのS3のバケットを、下記のように設定していました。
resource "aws_s3_bucket" "alb_log" {
bucket = "hogehoge-alb-log"
force_destroy = true
// lifecycle_rule is an option to define lifecycle rule.
// Here, files that are 180 days old will be automatically deleted.
lifecycle_rule {
enabled = true
expiration {
days = "180"
}
}
}
resource "aws_s3_bucket_policy" "alb_log" {
bucket = aws_s3_bucket.alb_log.id
policy = data.aws_iam_policy_document.alb_log.json
}
// "aws_iam_policy_document" defines access right from sercvices of AWS such as ALB to S3.
data "aws_iam_policy_document" "alb_log" {
statement {
effect = "Allow"
actions = ["s3:PutObject"]
resources = ["arn:aws:s3:::${aws_s3_bucket.alb_log.id}/*"]
// The identifiers is the account ID. This is not your AWS account ID.
// https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-access-logs.html
principals {
type = "AWS"
identifiers = ["582318560864"]
}
}
}
ここでALBからS3へのアクセスポリシーを aws_iam_policy_document
というresourceで定義しているのですが、この中の identifiers
という項目で自分のAWSアカウントのIDを指定しまっていたのが原因でした。
この identifiers
は ロードバランサーのリージョンに対応する AWS アカウント ID を指定 します。
新しいバケットポリシーを作成する場合は、このポリシードキュメント全体をポリシーエディタにコピーし、プレースホルダーをお客様のバケットのバケット名とプレフィックス、ロードバランサーのリージョンに対応する AWS アカウント ID に置き換えます。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-access-logs.html
まとめ
GCP、AWSなどのパブリッククラウド系のサービスはフロントエンド並にアップデートが激しく、常に新しい情報をキャッチアップするのは大変です。
しかし重要な技術分野の一つなので、インスタンスやロードバランサー、ストレージなどの基本的なサービスやアーキテクチャを抑えつつ、仕事で活用していきたいと思います。