μ•ˆλ…•ν•˜μ„Έμš” Mambo μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ S3 버킷에 μ•‘μ„ΈμŠ€ν•  수 μžˆλ„λ‘ κ΅¬μ„±ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.

졜근 νšŒμ‚¬μ—μ„œ μ§„ν–‰ν•˜κ³  μžˆλŠ” ν”„λ‘œμ νŠΈ μ€‘μ—λŠ” λ³΄μ•ˆ 정책에 μ˜ν•΄ 고객이 κ΅¬μ„±ν•œ EC2 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ ‘κ·Ό μ •λ³΄λ§Œμ„ μ œκ³΅λ°›μ•„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ν•΄μ•Όν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€. ν˜„μž¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μ€‘μΈ λ°μ΄ν„°λ² μ΄μŠ€ μ€‘μ—λŠ” EC2 μΈμŠ€ν„΄μŠ€μ— 직접 μ„€μΉ˜ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μžˆλŠ” μƒμš© μ‹œκ³„μ—΄ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터λ₯Ό 주기적으둜 λ°±μ—…ν•˜κΈ° μœ„ν•˜μ—¬ 맀일 1μ‹œμ— 파일둜 μ €μž₯된 데이터λ₯Ό μ••μΆ•ν•˜μ—¬ S3둜 μ €μž₯ν•˜λŠ” 슀크립트λ₯Ό μˆ˜ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 고객이 λ³΄μœ ν•œ EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ 이 λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ°±μ—… νŒŒμΌμ„ μ €μž₯ν•˜κΈ° μœ„ν•œ S3 버킷에 λŒ€ν•œ κΆŒν•œμ„ 지정해주도둝 μœ λ„ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

S3 버킷 μ •μ±…

S3μ—μ„œ 버킷을 λ§Œλ“€λ©΄ 기본적으둜 λͺ¨λ“  퍼블릭 μ•‘μ„ΈμŠ€ μ°¨λ‹¨λ©λ‹ˆλ‹€.

그리고 버킷 정책을 톡해 버킷 λ˜λŠ” 버킷에 μ €μž₯된 μ˜€λΈŒμ νŠΈμ— λŒ€ν•œ μ•‘μ„ΈμŠ€ κΆŒν•œμ„ λΆ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

버킷 μ •μ±… 생성

버킷 정책을 생성할 λ•ŒλŠ” μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” AWS Policy Generatorλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ νŠΉμ • IP에 λŒ€ν•΄μ„œ 버킷에 λŒ€ν•œ 쑰회, 읽기, μ“°κΈ° κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” 정책을 μƒμ„±ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::mambo.kr",
                "arn:aws:s3:::mambo.kr/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "218.156.190.x/32"
                }
            }
        }
    ]
}

버킷 정책을 μ •μ˜ν•˜λŠ” JSON의 ν¬κΈ°λŠ” 20kB둜 μ œν•œλ©λ‹ˆλ‹€.

버킷 정책에 λŒ€ν•œ 더 μžμ„Έν•œ λ‚΄μš©μ€ 버킷 μ •μ±… 예제 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

EC2 μΈμŠ€ν„΄μŠ€

μ•„λ§ˆμ‘΄ λ¦¬λˆ…μŠ€ AMI둜 EC2 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ν•˜λ©΄ AWS CLIκ°€ 기본으둜 μ„€μΉ˜λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, AWS CLIλ₯Ό μ‚¬μš©ν•΄μ„œ S3 μ„œλΉ„μŠ€μ— μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

IAM μ—­ν•  생성

S3 버킷 κΆŒν•œ μ„€μ •μ—μ„œ 버킷 정책을 μ„€μ •ν•  수 μžˆμœΌλ‚˜ IAM 역할을 λ§Œλ“€κ³  인라인 μ •μ±…μœΌλ‘œ μ μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ μ ‘κ·Όν•΄μ•Όν•˜λ―€λ‘œ EC2 μ„œλΉ„μŠ€μ— λŒ€ν•œ IAM 역할을 λ§Œλ“€μ–΄μ„œ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνŒŒμΌλ‘œ λ“±λ‘ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ €, EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ AWS CLI둜 버킷을 μ‘°νšŒν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

ν˜„μž¬ EC2 μΈμŠ€ν„΄μŠ€μ—λŠ” IAM μΈμŠ€ν„΄μŠ€ ν”„λ‘œνŒŒμΌμ΄ μ§€μ •λ˜μ–΄μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

IAM λ©”λ‰΄μ—μ„œ μ‹ κ·œλ‘œ 역할을 μƒμ„±ν•©λ‹ˆλ‹€.

S3 버킷에 λŒ€ν•œ κΆŒν•œμ„ 인라인 μ •μ±…μœΌλ‘œ μ •μ˜ν•  κ²ƒμ΄λ―€λ‘œ κ΄€λ¦¬ν˜• 정책은 μ„€μ •ν•˜μ§€μ•ŠμŠ΅λ‹ˆλ‹€.

μƒμ„±ν•œ IAM 역할을 EC2 μΈμŠ€ν„΄μŠ€ ν”„λ‘œνŒŒμΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.

IAM 역할에 μ–΄λ– ν•œ 정책을 μ μš©ν•˜μ§€ μ•Šκ³  버킷을 μ‘°νšŒν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

IAM 역할을 μ§€μ •ν•˜μ˜€κΈ°μ— AWS CLIλ₯Ό μ‚¬μš©ν•  수 있게 λ˜μ—ˆμ§€λ§Œ mambo.kr μ΄λΌλŠ” 버킷에 λŒ€ν•œ ListObjectsV2 μž‘μ—…μ€ Access Denied 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

인라인 μ •μ±…

μš°λ¦¬κ°€ μƒμ„±ν•œ IAM μ—­ν• μ—λŠ” μ–΄λ– ν•œ 정책도 μ—°κ²°ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ ‘κ·Ό κΆŒν•œμ„ 가지지 μ•ŠλŠ”κ²Œ λ‹Ήμ—°ν•©λ‹ˆλ‹€. λ‹€μ‹œ IAM λ©”λ‰΄λ‘œ λŒμ•„κ°€μ„œ 인라인 μ •μ±… μΆ”κ°€λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

버킷 μ •μ±… 예제λ₯Ό μ°Έκ³ ν•΄μ„œ λ‹€μŒκ³Ό 같이 JSON ν˜•μ‹μœΌλ‘œ 버킷 정책을 μ •μ˜ν•©λ‹ˆλ‹€.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Mannual",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::mambo.kr",
                "arn:aws:s3:::mambo.kr/*"
            ]
        }
    ]
}

버킷 쑰회

S3 버킷에 λŒ€ν•œ 정책이 IAM 인라인 μ •μ±…μœΌλ‘œ μ—°κ²°λ˜μ—ˆμœΌλ‹ˆ 버킷에 λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ΄ κ°€μ§€κ²Œ λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ μ‚¬μš©μž κ³„μ •μ˜ λ³΄μœ ν•œ S3 버킷에 λŒ€ν•œ λͺ©λ‘μ€ κΆŒν•œμ΄ μ—†μ–΄μ„œ μ‘°νšŒν•  수 μ—†μœΌλ‚˜ 인라인 μ •μ±…μœΌλ‘œ μ •μ˜λœ mambo.kr 버킷에 λŒ€ν•΄μ„œλŠ” μ‘°νšŒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½, S3 버킷 λͺ©λ‘μ„ μ‘°νšŒν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 Statementλ₯Ό μΆ”κ°€ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Mannual",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::mambo.kr",
                "arn:aws:s3:::mambo.kr/*"
            ]
        },
        {
            "Sid": "Mannual-2",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*"
            ]
        }
    ]
}

빈 ν…μŠ€νŠΈ νŒŒμΌμ„ λ§Œλ“€μ–΄μ„œ 버킷에 μ—…λ‘œλ“œν•˜κ³  κ°€μ Έμ˜¬ 수 μžˆλŠ”μ§€ ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

S3에 μ €μž₯ν•  수 μžˆλŠ” 크기에 λŒ€ν•œ μ œν•œμ€ μ—†μœΌλ‚˜ PUT μš”μ²­μœΌλ‘œ μ—…λ‘œλ“œ κ°€λŠ₯ν•œ ν¬κΈ°λŠ” μ΅œλŒ€ 5GBμž…λ‹ˆλ‹€. AWS CLI의 S3 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 일정 크기 이상이라면 λ©€ν‹°νŒŒνŠΈ μ—…λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•˜λ―€λ‘œ μ•Œκ³  κ³„μ‹œκ³  신경쓰지 μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

마치며

퍼블릭 IPκ°€ ν• λ‹Ήλ˜μ§€ μ•ŠλŠ” EC2 μΈμŠ€ν„΄μŠ€λΌλ©΄ AWS PrivateLink둜 κ΅¬μ„±λ˜λŠ” VPC μΈν„°νŽ˜μ΄μŠ€ μ—”λ“œν¬μΈνŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ S3 μ„œλΉ„μŠ€μ™€ 톡신할 수 μžˆλ„λ‘ μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€. 그리고 λ‹€λ₯Έ μ‚¬μš©μž κ³„μ •μ˜ ARN을 μ œκ³΅λ°›μ•„μ„œ μ ‘κ·Όν•  수 있게 ꡬ성할 μˆ˜λ„ μžˆμœΌλ‹ˆ 곡식 λ¬Έμ„œμ—μ„œ μ œκ³΅ν•˜λŠ” λ‹€μ–‘ν•œ μ •μ±… 예제λ₯Ό μ°Έκ³ ν•΄λ΄…μ‹œλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€.