티스토리 뷰
반응형
시나리오
1) 사용자는 CloudFront에서 제공하는 Domain Name을 통해 Request를 보낸다.
예를 들면, http://cloudfront.example.com/test.mp4와 같은 Request!
2) CloudFront는 Behavior 목록에서 /test.mp4에 일치하는 Path Pattern을 찾는다.
3) 찾은 항목의 Origin에 설정된 Origin Domain Name & Path 로 전달한다.
사용자는 S3 Bucket에 직접 접근할 수 없고, CloudFront를 통해서만 접근할 수 있다. 이때 CloudFront에 보호 계층을 추가해 전체적인 인프라 구성에 보안성을 향상시킬 수 있다.
자세한 내용은 CloudFront 포스팅을 참고하자.
s3.tf
# original이라는 이름의 S3 Bucket을 생성
resource "aws_s3_bucket" "original" {
bucket = "chanjun-project-original"
acl = "private"
versioning {
enabled = true
}
cors_rule {
allowed_headers = [ "*" ]
allowed_methods = [ "GET" ]
allowed_origins = [ "*" ]
max_age_seconds = 3000
}
website {
index_document = "index.html"
}
}
# original Bucket의 정책을 설정
# 해보니 Public Access가 가능하다는 경고가 표시되는데.. 외부에서 직접 접근도 가능하고..
# 이 부분을 해결할 방법을 찾아야겠다.
resource "aws_s3_bucket_policy" "b" {
bucket = aws_s3_bucket.original.id
policy = <<-EOF
{
"Version": "2012-10-17",
"Statement": [
{
# 한마디로 누구나 original Bucket안에 저장된 모든 파일을 Get할수 있다는 것!!
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::${aws_s3_bucket.original.id}/*"
]
}
]
}
EOF
}
# 테스트용 파일 업로드 (source는 Terraform 폴더 같은 경로에 존재해야한다.)
resource "aws_s3_bucket_object" "test" {
bucket = aws_s3_bucket.original.id
key = "test.mp4"
source = "test.mp4"
}
cloudfront.tf
# CloudFront Distribution을 생성
resource "aws_cloudfront_distribution" "myCloudFront" {
# 이게 아마 Default Origin을 생성하는 과정인걸로...?
origin {
domain_name = aws_s3_bucket.original.bucket_domain_name
origin_id = "chanjun-project"
# 이건 도통 뭔지 모르겠음...ㅠ 일단 임의로 넣어주긴함(잘됨)
s3_origin_config {
origin_access_identity = aws_cloudfront_origin_access_identity.chanjun-origin-access.cloudfront_access_identity_path
}
}
enabled = true
default_cache_behavior {
allowed_methods = [ "GET", "HEAD" ]
cached_methods = [ "GET", "HEAD" ]
target_origin_id = "chanjun-project"
viewer_protocol_policy = "allow-all"
forwarded_values {
query_string = false
headers = [ "Origin", "Access-Control-Request-Headers", "Access-Control-Request-Method" ]
cookies {
forward = "none"
}
}
}
restrictions {
geo_restriction {
restriction_type = "none"
}
}
viewer_certificate {
cloudfront_default_certificate = true
}
retain_on_delete = true
}
data "aws_iam_policy_document" "s3_policy" {
statement {
actions = [ "s3:GetObject" ]
resources = [ "${aws_s3_bucket.original.arn}/*" ]
effect = "Allow"
principals {
identifiers = [ "*" ]
type = "*"
}
}
statement {
actions = [ "s3:GetObject" ]
resources = [ "${aws_s3_bucket.original.arn}/*" ]
principals {
identifiers = [ aws_cloudfront_origin_access_identity.chanjun-origin-access.iam_arn ]
type = "AWS"
}
}
}
# 이것도 왜만든거지ㅋㅋㅋㅋ 기억상실증..
resource "aws_s3_bucket_policy" "example" {
bucket = aws_s3_bucket.original.id
policy = data.aws_iam_policy_document.s3_policy.json
}
# 임의로 생성.. 뭔지 모르겠다
resource "aws_cloudfront_origin_access_identity" "chanjun-origin-access" {
comment = "chanjun-project"
}
반응형
'Cloud > Terraform' 카테고리의 다른 글
[Cloud AWS] Terraform을 사용한 인프라 구성3 (예정) (0) | 2021.02.08 |
---|---|
[Cloud AWS] Terraform을 사용한 인프라 구성1 (0) | 2021.02.01 |
[Cloud AWS] Terraform Import 활용하기 (0) | 2020.09.23 |
[Cloud AWS] Terraform AWS S3에 terraform.tfstate 저장하기 (Remote State Storage) (0) | 2020.09.15 |
[Cloud AWS] Terraform 입력/출력 변수 선언 (0) | 2020.09.10 |