개요
4-2 캡스톤 프로젝트에서 만드는 웹서비스는 여러 JSON 파일들을 실시간으로 받아올 필요가 있는데 그 떄 사용할 저장소로 S3 Bucket을 사용할 것이다.
이전에 Bastion 및 Vpc 환경을 Terraform으로 만들었던 것처럼 S3도 Terraform으로 생성한다.
S3
resource "aws_s3_bucket" "s3" {
bucket = "${var.common_info.env}-${var.common_info.service_name}-bucket"
tags = {
environment = "${var.common_tags.Environment}"
}
}
resource "aws_s3_bucket_public_access_block" "public-access" {
bucket = aws_s3_bucket.s3.id
block_public_acls = false
block_public_policy = false
ignore_public_acls = false
restrict_public_buckets = false
}
resource "aws_s3_bucket_policy" "bucket-policy" {
bucket = aws_s3_bucket.s3.id
depends_on = [
aws_s3_bucket_public_access_block.public-access
]
policy = <<POLICY
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"PublicRead",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::${aws_s3_bucket.s3.id}/*"]
}
]
}
POLICY
}
또 프로젝트에서 사용할 React와 Fastapi에서 정상 접근할 수 있도록 CORS 설정을 해준다.
resource "aws_s3_bucket_cors_configuration" "example" {
bucket = aws_s3_bucket.s3.id
cors_rule {
allowed_headers = ["*"]
allowed_methods = ["GET", "POST", "PUT"]
allowed_origins = ["*"]
expose_headers = ["ETag"]
max_age_seconds = 3000
}
}
생성 확인
EC2 인스턴스 역할 추가
서비스 컨테이너들이(React, Fastapi)는 S3에 접근하기 위해서는 권한이 있어야 한다. AWS IAM USER를 생성한 뒤 서비스 컨테이너 내부에서 환경변수 등을 통해 직접 연결하는 방식도 있고 EC2 인스턴스 자체에 S3를 사용할 권한을 부여하는 방법이 있다.
Fastapi 같은 경우 같은 Python 언어로 만들어진 Boto3 라이브러리를 사용하여 EC2 인스턴스 자체에 권한이 있을경우 아래에서 띄워지는 컨테이너들이 S3에 접근할 권한을 자동적으로 취득한다.
다음은 terraform으로 역할을 생성하는 과정이다.
esource "aws_iam_policy" "s3_access_policy" {
name = "ec2_s3_access_policy"
description = "Allow EC2 to access S3 buckets"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
Resource = [
"arn:aws:s3:::dev-jeus-bucket", # S3 버킷
"arn:aws:s3:::dev-jeus-bucket/*" # 버킷 내 객체
]
}
]
})
}
# 역할에 정책 연결
resource "aws_iam_role_policy_attachment" "ec2_role_policy_attach" {
role = aws_iam_role.ec2_role.name
policy_arn = aws_iam_policy.s3_access_policy.arn
}
resource "aws_iam_role" "ec2_role" {
name = "ec2_s3_access_role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = {
Service = "ec2.amazonaws.com"
},
Action = "sts:AssumeRole"
}
]
})
}
# IAM 인스턴스 프로파일 생성
resource "aws_iam_instance_profile" "ec2_instance_profile" {
name = "ec2_instance_profile"
role = aws_iam_role.ec2_role.name
}
해당 부분을 ec2 bastion을 생성한 파일에 추가한다.
iam_instance_profile = aws_iam_instance_profile.ec2_instance_profile.name
결과 확인
역할이 권한과 잘 연결되고 또 ec2 인스턴스에 역할이 할당된 것을 확인 가능하다.
'IAC > Terraform' 카테고리의 다른 글
[Terraform] AWS ALB 프로비저닝 (0) | 2024.12.09 |
---|---|
[Terraform] Karpenter 프로비저닝 (1) | 2024.12.09 |
[Terraform] EKS 프로비저닝 (0) | 2024.12.09 |
[Terraform] 고가용성 Multi AZ's VPC 환경 프로비저닝 (0) | 2024.12.09 |
[Terraform] AWS bastion 및 vpc 프로비저닝 (0) | 2024.12.05 |