はじめに
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からのアクセスに限定することができます。
そのため、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の作成
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
)が付与されました。
おわりに
書いてしまえばdepends_on
を指定するだけの話ですが、方法を思いつくのに時間がかかったため、記事に残しておこうと思います。