DevOps/AWS

AWS S3 ํผ๋ธ”๋ฆญ ๋ฒ„ํ‚ท ์ƒ์„ฑํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2024. 1. 2.
Amazon Simple Storage Service(Amazon S3)๋Š” ์—…๊ณ„ ์ตœ๊ณ ์˜ ํ™•์žฅ์„ฑ, ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ, ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ทœ๋ชจ์™€ ์—…์ข…์˜ ๊ณ ๊ฐ์€ Amazon S3๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ, ์›น ์‚ฌ์ดํŠธ, ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฐฑ์—… ๋ฐ ๋ณต์›, ์•„์นด์ด๋ธŒ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, IoT ๋””๋ฐ”์ด์Šค, ๋น… ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์›ํ•˜๋Š” ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Amazon S3๋Š” ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค, ์กฐ์ง ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ตœ์ ํ™”, ๊ตฌ์กฐํ™” ๋ฐ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ :  https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/Welcome.html

 

 

 

์ด๋ฏธ์ง€ ์ €์žฅ์„ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— ํ•˜๊ธด์— ํ”„๋กœ์ ํŠธ ์šฉ๋Ÿ‰์ด ๋„ˆ๋ฌด ์ปค์ง€๊ณ  ๋ฒ”์šฉ์„ฑ์ด ๋–จ์–ด์ง€๋‹ˆ ๊ฐ€์ƒ์˜ ์ €์žฅ ๊ณต๊ฐ„์— ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์–ด ๋†“๊ณ  ์•ก์„ธ์Šค๋ฅผ ํผ๋ธ”๋ฆญํ•˜๊ฒŒ ๋‘์–ด์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ์•ก์„ธ์Šคํ‚ค๋ฅผ ๊ฐ–๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ํ”„๋ก ํŠธ์— ์ค„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐ”๋กœ ๊บผ๋‚ด๋‹ค ์“ด๋‹คํ•˜์—ฌ, ํ•œ๋ฒˆ ํผ๋ธ”๋ฆญํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

S3 ๋งŒ๋“ค๊ธฐ

 

๋จผ์ € AWS์˜ S3 ์„œ๋น„์Šค๋กœ ๋“ค์–ด์˜จ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผํ™ฉ์ƒ‰ ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•œ๋‹ค.

 

 

 

 

๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์„ ์ •ํ•œ๋‹ค. ๊ฐ์ฒด ์†Œ์œ ๊ถŒ์€ ๊ถŒ์žฅ์œผ๋กœ ์„ฑ์ •ํ•œ๋‹ค.

 

 

 

 

ํผ๋ธ”๋ฆญํ•œ S3๋ฅผ ๋งŒ๋“ค๊ฒƒ์ž„์œผ๋กœ ์•ก์„ธ์Šค ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜๊ณ  ์ธ์ง€ํ•˜๊ณ  ์žˆ์Œ์„ ํด๋ฆญํ•œ๋‹ค.

ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ๋ณด์•ˆ์ƒ ์•ˆ์ข‹์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ S3 ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ํ”„๋ผ์ด๋น—ํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๋Š” ๊ฑธ ๋” ์ถ”์ฒœํ•œ๋‹ค.

 

 

 

 

๋‚˜๋จธ์ง€๋Š” ๊ธฐ๋ณธ์„ค์ •์œผ๋กœ ํ•˜๊ณ  ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ๋“ค์–ด์ง„ ๋ฒ„ํ‚ท์„ ๋ˆŒ๋Ÿฌ ๋ฒ„ํ‚ท์— ๋“ค์–ด์˜จ๋‹ค.

 

๋ฒ„ํ‚ท ๊ถŒํ•œ - ์ •์ฑ… ์„ค์ •ํ•˜๊ธฐ

 

 

 

๊ถŒํ•œ ํƒญ์„ ๋ˆŒ๋Ÿฌ ์ด์   ๋งŒ๋“  S3์˜ ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

 

 

 

 

์ด์   ๋ฒ„ํ‚ท ์ •์ฑ…์„ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

ํŽธ์ง‘ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค.

 

 

 

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::๋ฒ„ํ‚ท๋ช…/*"
        }
    ]
}

 

 

์ด JSON ๋ฌธ์ž์—ด์„ ํŽธ์ง‘์„ ๋ˆŒ๋Ÿฌ์„œ ์ž‘์„ฑํ•˜๋„๋ก ํ•œ๋‹ค. Resource ์€ ์œ„์— ARN ์— ์žˆ๋Š” ์ž์‹ ์˜ ๋ฒ„ํ‚ท๋ช…์„ ๋„ฃ๊ณ  ๊ทธ ๋’ค์—” ๋ชจ๋“  ํŒจ์Šค๊ฐ€ ์˜ฌ์ˆ˜ ์žˆ๋„๋ก ์™€์ผ๋“œ์นด๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ์„ ๋ˆ„๋ฅธ๋‹ค!

 

 

์ด๊ฑด JSON ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋œ IAM ์ •์ฑ…์ด๋‹ค. ์ด ์ •์ฑ…์€ AWS ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค.

  1. Version: ์ด ๋ถ€๋ถ„์€ ์ •์ฑ… ์–ธ์–ด์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋œ "2012-10-17"์€ ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” ์ •์ฑ… ์–ธ์–ด์˜ ๋ฒ„์ „์ด๋‹ค.
  2. Statement: ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์‹ค์ œ ์ ‘๊ทผ ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค. ์ด ์ •์ฑ…์—๋Š” ํ•˜๋‚˜์˜ statement (Statement1)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
  3. Sid (Statement ID): "Statement1"์€ ์ด ๊ทœ์น™์— ๋Œ€ํ•œ ์‹๋ณ„์ž๋กœ, ์ •์ฑ… ๋‚ด์—์„œ ๊ฐ statement๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  4. Effect: ์ด ๋ถ€๋ถ„์€ ๊ทœ์น™์˜ ํšจ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. "Allow"๋Š” ํŠน์ • ์กฐ๊ฑด ํ•˜์— ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  5. Principal: ์ด ๋ถ€๋ถ„์€ ์ •์ฑ…์ด ์ ์šฉ๋˜๋Š” ๋Œ€์ƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. "*"๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ๋˜๋Š” ์—”ํ„ฐํ‹ฐ์— ์ ์šฉ๋จ์„ ์˜๋ฏธํ•œ๋‹ค.
  6. Action: ์ด ๋ถ€๋ถ„์€ ํ—ˆ์šฉ๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. "s3:GetObject"๋Š” ์‚ฌ์šฉ์ž๊ฐ€ S3 ๋ฒ„ํ‚ท์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.
  7. Resource: ์ด ๋ถ€๋ถ„์€ ์ •์ฑ…์ด ์ ์šฉ๋˜๋Š” AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค. "arn:aws:s3:::๋ฒ„ํ‚ท๋ช…/*"๋Š” ํŠน์ • S3 ๋ฒ„ํ‚ท(์—ฌ๊ธฐ์„œ '๋ฒ„ํ‚ท๋ช…'์œผ๋กœ ํ‘œ์‹œ๋จ) ๋‚ด์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•œ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ์ด ์ •์ฑ…์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •๋œ S3 ๋ฒ„ํ‚ท ๋‚ด์˜ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์—ด๋ฆฐ ์ ‘๊ทผ์€ ๊ณต๊ฐœ์ ์œผ๋กœ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

 

 

 

์ƒˆ๋กœ๊ณ ์นจ์„ ๋ˆŒ๋Ÿฌ ๋ณด๋ฉด  ์•ก์„ธ์Šค๊ฐ€ ํผ๋ธ”๋ฆญ์œผ๋กœ ๋ฐ”๋€๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฒ„ํ‚ท ๊ถŒํ•œ - CORS ์„ค์ •

 

์ด์   ์•„๋ž˜๋กœ ์Šคํฌ๋กค์„ ๋‚ด๋ ค CORS ์„ค์ •์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

 

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "HEAD",
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

 

ํŽธ์ง‘์„ ๋ˆŒ๋Ÿฌ ์œ„ JOSN ๋ฌธ์ž์—ด์„ ๊ธฐ์ž…ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ €์žฅํ•œ๋‹ค.

 

 

 

์ด JSON ๊ตฌ์กฐ๋Š” CORS(Cross-Origin Resource Sharing) ์„ค์ •์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ ์š”์†Œ์˜ ์˜๋ฏธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค:

  1. AllowedHeaders: ์ด ์„ค์ •์€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” HTTP ํ—ค๋”๋ฅผ ์ •์˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ["*"]๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ—ค๋”๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.
  2. AllowedMethods: ์ด ์„ค์ •์€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ—ˆ์šฉ๋˜๋Š” HTTP ์š”์ฒญ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ["HEAD", "GET", "PUT", "POST", "DELETE"]๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด, ์ด๋“ค ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ํ—ˆ์šฉ๋จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  3. AllowedOrigins: ์ด ์„ค์ •์€ ์–ด๋–ค ์ถœ์ฒ˜(๋„๋ฉ”์ธ, ์Šคํ‚ค๋งˆ, ํฌํŠธ)์˜ ์š”์ฒญ์ด ์„œ๋ฒ„์— ์˜ํ•ด ํ—ˆ์šฉ๋ ์ง€ ์ •์˜ํ•œ๋‹ค. ["*"]๋Š” ๋ชจ๋“  ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  4. ExposeHeaders: ์ด ์„ค์ •์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”๋ฅผ ์ •์˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋นˆ ๋ฐฐ์—ด []๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด, ์ถ”๊ฐ€๋กœ ๋…ธ์ถœํ•  ํ—ค๋”๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ์ด CORS ์„ค์ •์€ ๋ชจ๋“  ์ถœ์ฒ˜์—์„œ ์˜ค๋Š” ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๊ณ , ๋ชจ๋“  ํ—ค๋”๋ฅผ ๋ฐ›์•„๋“ค์ด๋ฉฐ, HEAD, GET, PUT, POST, DELETE ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ถ”๊ฐ€๋กœ ๋…ธ์ถœํ•  ํŠน์ • ํ—ค๋”๋Š” ์ง€์ •ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด ์„ค์ •์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค์–‘ํ•œ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์ง€๋งŒ, ๋ณด์•ˆ์ƒ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

๋ชจ๋“  ์„ค์ •์ด ๋๋‚ฌ๋‹ค.

 

 

์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ํ…Œ์ŠคํŠธ

 

์ด์   ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ ํ•˜๊ณ  URL์„ ํ†ตํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด๋„๋กํ•˜๊ฒ ๋‹ค.

์—…๋กœ๋“œ๋ฅผ ๋ˆŒ๋Ÿฌ์ค€๋‹ค.

 

 

 

ํŒŒ์ผ์ถ”๊ฐ€๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋กœ์ปฌ์—์„œ ์ถ”๊ฐ€ํ•  ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ๊ณ  ์—…๋กœ๋“œํ•  ์ด๋ฏธ์ง€๋ฅผ ์ฒดํฌํ•˜๊ณ , ์—…๋กœ๋“œ๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

 

 

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์˜ฌ๋ผ๊ฐ€์ง„ ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ์ดํŒŒ์ผ์„ ๋ˆŒ๋Ÿฌ์„œ URL์„ ํ™•์ธํ•œ๋‹ค.

 

 

 

์ด๋ ‡๊ฒŒ ๋‚˜์˜จ ๊ฐ์ฒด URL ์„ ์“ฐ๋ฉด ์ด์   ๊ฐ€์ƒ์˜ ๋ฒ„ํ‚ท์— ์˜ฌ๋ผ์˜จ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.  /์ด๋ฏธ์ง€๋ช….ํ™•์žฅ์ž ๋ช…์„ ์ œ์™ธํ•œ ์•ž URL path๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋‹ˆ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋‘๊ณ  ์ด๋ฏธ์ง€๋ช…๋งŒ ๋ถ™์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋Œ“๊ธ€