1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでVPC Origin作成時にVPC Origin用のセキュリティグループIDをインバウンドルールに紐付ける。

Posted at

はじめに

TerraformでCloudFrontのVPC Originを作成する際に、一度のapplyでELBのセキュリティグループのインバウンドルールにVPC Origin用のセキュリティグループIDをソースとして指定したルールを作成することができたため、紹介したいと思います。

VPC Origin作成時の問題について

CloudFrontのVPC Originを作成すると、CloudFrontから直接プライベートのInternal ELBやEC2に接続するためのENIとENIに紐付くセキュリティグループが自動で作成されます。

CloudFrontから内部のELBやEC2にアクセスする際にはENIを通ってアクセスすることになるため、ENIに紐付くセキュリティグループのIDをELBやEC2のセキュリティグループのインバウンドルールにソース指定することで、CloudFrontからのアクセスに限定することができます。

vpc_origin.png

そのため、TerraformでVPC Originを作成する際に、ELBやEC2のセキュリティグループのインバウンドルールもまとめて更新したいところですが、ENIとENIに紐付くセキュリティグループはVPC Originを作成した際に同時に作られるため、予め指定することはできないことから、VPC Origin作成後に、作成されたVPC Origin用セキュリティグループを指定して再度applyする必要があります。

また、VPC Originで作成されるENIはCloudFront用の特殊なENIのため、TerraformやCLIで事前に作成しておくことはできません。

VPC Originとセキュリティグループのインバウンドルールへの紐付けを一度に行う

VPC Origin作成時に同時に作成されるセキュリティグループ名は固定でCloudFront-VPCOrigins-Service-SGと決められているので、VPC Originリソース作成後にCloudFront-VPCOrigins-Service-SGのセキュリティグループIDを検索した後、ELBやEC2のインバウンドセキュリティグループルールに紐付ける処理が動くようにすれば問題ありません。

そのため以下のようにdepends_onで作成順を制御することで一度にインバウンドセキュリティグループルールへの紐付けまで行なうことができます。

以下、VPC OriginとELB用セキュリティグループを作成するterraformの抜粋。
※ELBの作成とVPCの作成リソースは除外しているので、実際に作成する際には設定してください。

VPC Origin用セキュリティグループの紐付け
# VPC Originの作成
resource "aws_cloudfront_vpc_origin" "elb" {
  vpc_origin_endpoint_config {
    name                   = "Example VPC Origin"
    arn                    = aws_lb.elb.arn
    http_port              = 8080
    https_port             = 8443
    origin_protocol_policy = "https-only"

    origin_ssl_protocols {
      items    = ["TLSv1.2"]
      quantity = 1
    }
  }
}

# CloudFront-VPCOrigins-Service-SGのセキュリティグループIDの取得
data "aws_security_group" "vpc_origin_sg" {
  # VPC Origin作成時に作られるセキュリティグループIDを取得するため、depends_onでVPC Originのリソースを指定
  depends_on = [aws_cloudfront_vpc_origin.elb]
  filter {
    name   = "group-name"
    values = ["CloudFront-VPCOrigins-Service-SG"]
  }
}

# ELB用セキュリティグループ
resource "aws_security_group" "elb" {
  name        = "elb-security-group"
  description = "elb-security-group"
  vpc_id      = aws_vpc.main.id
  tags = {
    Name = "elb-security-group"
  }
}

# ELB用セキュリティグループインバウンドルール
resource "aws_vpc_security_group_ingress_rule" "elb" {
  # VPC OriginのセキュリティグループID取得後にインバウンドルールに紐付けるため、depends_onでVPC Originのセキュリティグループのデータリソースを指定
  depends_on = [data.aws_security_group.vpc_origin_sg]

  security_group_id            = aws_security_group.elb.id
  ip_protocol                  = "tcp"
  from_port                    = 80
  to_port                      = 80
  referenced_security_group_id = data.aws_security_group.vpc_origin_sg.id
}

terraform apply実行後のELB用セキュリティグループ。

ELB用セキュリティグループのインバウンドルールのソースにVPC Origin用のセキュリティグループ(CloudFront-VPCOrigins-Service-SG)が付与されました。

Monosnap_20250126_193352.png

おわりに

書いてしまえばdepends_onを指定するだけの話ですが、方法を思いつくのに時間がかかったため、記事に残しておこうと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?