🐼
ALBのアクセスログをS3バケットへ保存するように設定して、terraform実行すると権限エラー
はじめに
ロードバランサーを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" {
[参考]
なぜエラーになったか
s3バケット側で、ALBからのアクセスを許可をする際に、アカウントIDの指定方法を間違えていました。正直参考記事と全く同じ現象だったのですが、下記部分が理解できなくて苦しみました。
ロードバランサーのリージョンに対応する AWS アカウント ID を指定します。
[参考]
ロードバランサーのリージョンに対応するAWSアカウントIDとは
下記公式を確認することで、解決しました。
ロードバランサーのリージョンに対応するAWSアカウントIDとは、要するに、S3のバケットポリシーで使用するアカウントIDのことのようです。
AWSアカウントを作成時に割り当てられるアカウントIDとは別物です。
執筆時点で、東京リージョンのアカウントIDは、582318560864でした。
[公式]
最終的に出来上がったもの
s3バケットのコード
# ログバケットの作成
resource "aws_s3_bucket" "alb_log" {
bucket = "alb-log-pragmatic-terraform-sample"
# ラウフサイクルルールの設定
lifecycle_rule {
enabled = true
# 180日経過したファイルを自動削除
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
}
data "aws_iam_policy_document" "alb_log" {
statement {
effect = "Allow"
actions = ["*"]
resources = ["arn:aws:s3:::${aws_s3_bucket.alb_log.id}/*"]
principals {
type = "AWS"
# ここにロードバランサーのリージョンに対応する AWSアカウントIDを記載する
identifiers = ["582318560864"]
}
}
}
ロードバランサー
### ロードバランサー
resource "aws_lb" "example" {
## 中略
# アクセスログ
access_logs {
# バケット名を指定
bucket = aws_s3_bucket.alb_log.id
enabled = true
}
}
Discussion