[AWS] CloudFormation

CloudFormation์€ ์ธํ”„๋ผ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์„œ ์‹œ์Šคํ…œ์„ ๊ทธ๋•Œ๊ทธ๋•Œ ๋น ๋ฅด๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์„œ๋น„์Šค๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ •์ ํŽ˜์ด์ง€๋Š” S3๋ฅผ ๋งŒ๋“ค๊ณ , Cloudfront๋„ ๋งŒ๋“ค์–ด์„œ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ECS๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ๊ฒฝ์šฐ์—๋Š” ECS ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ณ , ์ž‘์—…์ •์˜ํ•˜๊ณ , ํƒ€๊ฒŸ๊ทธ๋ฃน๋งŒ๋“ค๊ณ , ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋งŒ๋“ค๊ณ , ECS ์„œ๋น„์Šค ๋งŒ๋“ค์–ด์„œ ๋„์šฐ๋Š” ๋“ฑ์˜ ๋งŽ์€ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ๋ฐ ์„ค์ •์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
์ด๋Ÿฐ ์ž‘์—…์„ ํ•œ๋ฒˆ๋งŒ ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ดœ์ฐฎ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ์—๋Š” ์ด๊ฑธ 2-3๋ฒˆ ๋ฐ˜๋ณตํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ ์ด์ƒ์„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๊ฑธ ๋งค๋ฒˆ ํ•˜๋‚˜ํ•˜๋‚˜ ํ•˜๋ ค๋ฉด ์ •๋ง ๋ฒˆ๊ฑฐ๋กญ๊ธฐ ๊ทธ์ง€์—†์„ ๊ฒƒ์ด๋‹ค. cloudformation์€ ์ด๊ฑธ ๋ชจ๋“ˆํ™”ํ•ด์ค€๋‹ค.

๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์˜คํ”ˆ์†Œ์Šค Terraform๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.




๋น„์šฉ

๋‹น์—ฐํžˆ ๊ณต์งœ๋Š” ์•„๋‹ˆ๋‹ค.
์—„์ฒญ ๋น„์‹ธ๋‹ค๊ณ  ํ• ์ •๋„๋Š” ์•„๋‹Œ๋ฐ, ๋ถ€๊ณผ ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋…ํŠนํ•˜๋‹ค.

https://aws.amazon.com/ko/cloudformation/pricing/




ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ

CloudFormation์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฒŒ ํ…œํ”Œ๋ฆฟ์ด๋‹ค.
ํ…œํ”Œ๋ฆฟ์†Œ์Šค๋ฅผ ์ž‘์„ฑํ•ด์„œ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊ณ , ์–ด๋–ป๊ฒŒ ์„ค์ •ํ• ์ง€๋ฅผ ์ „๋ถ€ ์ง€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‚˜๋Š” S3์™€ CloudFront๋งŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๋ ค ํ•œ๋‹ค.

ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ๋ฒ•์€ ์—ฌ๊ธฐ
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/template-guide.html

์ƒ˜ํ”Œ์€ ์—ฌ๊ธฐ์„œ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
์ฐธ๊ณ ํ•ด์„œ ์งœ๋ฉด ์ข‹๋‹ค. ๋”ฑ ๋งž๋Š”๊ฒŒ ์žˆ์œผ๋ฉด ๊ทธ๊ฑฐ ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ์จ๋„ ๋œ๋‹ค.
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/cfn-sample-templates.html

์ผ๋‹จ ํ…œํ”Œ๋ฆฟ์˜ ๊ธฐ์กด์ ์ธ ํ˜•ํƒœ๋Š” ์ด๋ ‡๋‹ค.
yaml๋„ ์žˆ์ง€๋งŒ ๋‚˜๋Š” json์ด ๋” ํŽธํ•ด์„œ ์ด๊ฑธ๋กœ ํ•œ๋‹ค.

{
  "AWSTemplateFormatVersion": "version date",
  "Description": "JSON string",
  "Metadata": {},
  "Parameters": {},
  "Rules": {},
  "Mappings": {},
  "Conditions": {},
  "Transform": {},
  "Resources": {},
  "Outputs": {}
}

ํ•˜๋‚˜์”ฉ ์งš์–ด๋ณด๊ฒ ๋‹ค.




AWSTemplateFormatVersion, Description

์ผ๋‹จ ๋ฒ„์ „์€ "2010-09-09"๋กœ ํ•˜๋ฉด ๋œ๋‹ค.
์„ค๋ช…๋„ ์•Œ์•„๋ณผ ์ˆ˜๋งŒ ์žˆ๊ฒŒ ์จ์ฃผ๋ฉด ๋œ๋‹ค. ํ•œ๊ธ€์„ ๋„ฃ์œผ๋ฉด ์˜ค๋ฅ˜๋Š” ๋‚˜์ง€ ์•Š์ง€๋งŒ ????๋กœ ๊นจ์ ธ์„œ ๋‚˜์˜จ๋‹ค.

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "์ •์ ์‚ฌ์ดํŠธ ๋ฐฐํฌ",


Metadata

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋‹น์žฅ ํ•„์š”ํ•˜์ง€๋„ ์•Š๊ณ , ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€๋„ ์•Š์•„์„œ ์ง€๋‚˜๊ฐ„๋‹ค.




Parameters

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ถ€๋ถ„์ด๋‹ค.

"Parameters": {
    "BucketName": {
      "Type": "String",
      "Description": "bucket name to generate",
      "AllowedPattern": "(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)",
      "ConstraintDescription": "must be a valid S3 bucket name."
    }
  },

๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋ฒ„ํ‚ท์ด๋ฆ„์„ ๊ทธ๋•Œ๊ทธ๋•Œ ๋ฐ›์•„์„œ ๊ทธ๊ฑธ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์ด๋‹ค.




Mappings

๋งคํ•‘์€ ๋ง ๊ทธ๋ž˜๋„ ๋งคํ•‘๊ฐ’๋“ค์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํ‚ค-๊ฐ’์˜ ํ˜•ํƒœ๋กœ ์ด๋Ÿฐ์ €๋Ÿฐ ๊ฐ’๋“ค์„ ์ง€์ •ํ•ด๋†“๊ณ  Fn::FindInMap๋ผ๋Š” ํ•จ์ˆ˜๋กœ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
๊ผญ ํ•„์š”ํ•œ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ์žˆ์œผ๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.
๋‚ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ๋ฆฌ์ „์— ๋งž๋Š” S3 ๋„๋ฉ”์ธ ๋งํฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

"Mappings": {๏ปฟ
    "Region2S3WebsiteSuffix": {
      "af-south-1": { "Suffix": ".s3-website.af-south-1.amazonaws.com" },
      "ap-east-1": { "Suffix": ".s3-website.ap-east-1.amazonaws.com" },
      "ap-northeast-1": {
        "Suffix": ".s3-website-ap-northeast-1.amazonaws.com"
      },
      "ap-northeast-2": {
        "Suffix": ".s3-website.ap-northeast-2.amazonaws.com"
      },
      "ap-northeast-3": {
        "Suffix": ".s3-website.ap-northeast-3.amazonaws.com"
      },
      "ap-south-1": { "Suffix": ".s3-website.ap-south-1.amazonaws.com" },
      "ap-southeast-1": {
        "Suffix": ".s3-website-ap-southeast-1.amazonaws.com"
      },
      "ap-southeast-2": {
        "Suffix": ".s3-website-ap-southeast-2.amazonaws.com"
      },
      "ca-central-1": { "Suffix": ".s3-website.ca-central-1.amazonaws.com" },
      "cn-north-1": { "Suffix": ".s3-website.cn-north-1.amazonaws.com.cn" },
      "cn-northwest-1": {
        "Suffix": ".s3-website.cn-northwest-1.amazonaws.com.cn"
      },
      "eu-central-1": { "Suffix": ".s3-website.eu-central-1.amazonaws.com" },
      "eu-north-1": { "Suffix": ".s3-website.eu-north-1.amazonaws.com" },
      "eu-south-1": { "Suffix": ".s3-website.eu-south-1.amazonaws.com" },
      "eu-west-1": { "Suffix": ".s3-website-eu-west-1.amazonaws.com" },
      "eu-west-2": { "Suffix": ".s3-website.eu-west-2.amazonaws.com" },
      "eu-west-3": { "Suffix": ".s3-website.eu-west-3.amazonaws.com" },
      "me-south-1": { "Suffix": ".s3-website.me-south-1.amazonaws.com" },
      "sa-east-1": { "Suffix": ".s3-website-sa-east-1.amazonaws.com" },
      "us-east-1": { "Suffix": ".s3-website-us-east-1.amazonaws.com" },
      "us-east-2": { "Suffix": ".s3-website.us-east-2.amazonaws.com" },
      "us-west-1": { "Suffix": ".s3-website-us-west-1.amazonaws.com" },
      "us-west-2": { "Suffix": ".s3-website-us-west-2.amazonaws.com" }
    }
  },


Resources

๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.
๊ฐ AWS ๋ฆฌ์†Œ์Šค๋“ค์„ ์–ด๋–ค ์„ค์ •๊ฐ’์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์—ฌ๊ธฐ์„œ ์ •์˜ํ•œ๋‹ค.

๊ฐ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ๊ฑด ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์ข‹๋‹ค.
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html

๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋จผ์ € S3๋ฅผ ๋งŒ๋“ ๋‹ค.

    "S3BucketForWebsiteContent": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "AccessControl": "PublicRead",
        "WebsiteConfiguration": {
          "IndexDocument": "index.html",
          "ErrorDocument": "error.html"
        },
        "BucketName": { "Ref": "BucketName" }
      }
    },

์—ฌ๊ธฐ์„œ "Type": "AWS::S3::Bucket"์€ ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์ด๋ž€ ๋œป์ด๋‹ค.
{ "Ref": "BucketName" }๋Š” ๋ณ€์ˆ˜ "BucketName"๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์œ„์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ทธ "BucketName"๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
๊ทธ๋ƒฅ ๋ฒ„ํ‚ท๋ช… ๋ฐ›์€๋Œ€๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฒŒ ๋‹ค๋‹ค.

๊ทธ๋‹ค์Œ์—๋Š” CloudFront ๋ฐฐํฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    "WebsiteCDN": {
      "Type": "AWS::CloudFront::Distribution",
      "Properties": {
        "DistributionConfig": {
          "Comment": "CDN for S3-backed website",
          "Enabled": "true",
          "DefaultCacheBehavior": {
            "ForwardedValues": { "QueryString": "true" },
            "TargetOriginId": "only-origin",
            "ViewerProtocolPolicy": "allow-all"
          },
          "DefaultRootObject": "index.html",
          "Origins": [
            {
              "CustomOriginConfig": {
                "HTTPPort": "80",
                "HTTPSPort": "443",
                "OriginProtocolPolicy": "http-only"
              },
              "DomainName": {
                "Fn::Join": [
                  "",
                  [
                    { "Ref": "S3BucketForWebsiteContent" },
                    {
                      "Fn::FindInMap": [
                        "Region2S3WebsiteSuffix",
                        { "Ref": "AWS::Region" },
                        "Suffix"
                      ]
                    }
                  ]
                ]
              },
              "Id": "only-origin"
            }
          ]
        }
      }
    }

์กฐ๊ธˆ ๋” ์„ค์ •์ด ๋งŽ๊ธด ํ•œ๋ฐ, DomainName ์†์„ฑ์— ๋ฐฉ๊ธˆ ๋งŒ๋“  S3 ๋ฒ„ํ‚ท ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ๋งŒ ์•Œ์•„๋„ ๋œ๋‹ค.
๋‚˜๋จธ์ง€๋Š” ๊ฑฐ์˜ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค.




Outputs

์•„์›ƒํ’‹์€ ๋ง ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ์ด๋‹ค.
๋ฐฐํฌ๋œ Cloudfront์˜ ID๋ฅผ ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

  "Outputs": {
    "WebsiteID": {
      "Value": {
        "Ref": "WebsiteCDN" 
      },
      "Description": "The URL of the newly created website"
    }
  }

์ „์ฒด ํ…œํ”Œ๋ฆฟ ์†Œ์Šค

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "์ •์ ์‚ฌ์ดํŠธ ๋ฐฐํฌ",
  "Metadata": {},
  "Parameters": {
    "BucketName": {
      "Type": "String",
      "Description": "bucket name to generate",
      "AllowedPattern": "(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)",
      "ConstraintDescription": "must be a valid S3 bucket name."
    }
  },
  "Rules": {},
  "Mappings": {
    "Region2S3WebsiteSuffix": {
      "af-south-1": { "Suffix": ".s3-website.af-south-1.amazonaws.com" },
      "ap-east-1": { "Suffix": ".s3-website.ap-east-1.amazonaws.com" },
      "ap-northeast-1": {
        "Suffix": ".s3-website-ap-northeast-1.amazonaws.com"
      },
      "ap-northeast-2": {
        "Suffix": ".s3-website.ap-northeast-2.amazonaws.com"
      },
      "ap-northeast-3": {
        "Suffix": ".s3-website.ap-northeast-3.amazonaws.com"
      },
      "ap-south-1": { "Suffix": ".s3-website.ap-south-1.amazonaws.com" },
      "ap-southeast-1": {
        "Suffix": ".s3-website-ap-southeast-1.amazonaws.com"
      },
      "ap-southeast-2": {
        "Suffix": ".s3-website-ap-southeast-2.amazonaws.com"
      },
      "ca-central-1": { "Suffix": ".s3-website.ca-central-1.amazonaws.com" },
      "cn-north-1": { "Suffix": ".s3-website.cn-north-1.amazonaws.com.cn" },
      "cn-northwest-1": {
        "Suffix": ".s3-website.cn-northwest-1.amazonaws.com.cn"
      },
      "eu-central-1": { "Suffix": ".s3-website.eu-central-1.amazonaws.com" },
      "eu-north-1": { "Suffix": ".s3-website.eu-north-1.amazonaws.com" },
      "eu-south-1": { "Suffix": ".s3-website.eu-south-1.amazonaws.com" },
      "eu-west-1": { "Suffix": ".s3-website-eu-west-1.amazonaws.com" },
      "eu-west-2": { "Suffix": ".s3-website.eu-west-2.amazonaws.com" },
      "eu-west-3": { "Suffix": ".s3-website.eu-west-3.amazonaws.com" },
      "me-south-1": { "Suffix": ".s3-website.me-south-1.amazonaws.com" },
      "sa-east-1": { "Suffix": ".s3-website-sa-east-1.amazonaws.com" },
      "us-east-1": { "Suffix": ".s3-website-us-east-1.amazonaws.com" },
      "us-east-2": { "Suffix": ".s3-website.us-east-2.amazonaws.com" },
      "us-west-1": { "Suffix": ".s3-website-us-west-1.amazonaws.com" },
      "us-west-2": { "Suffix": ".s3-website-us-west-2.amazonaws.com" }
    }
  },
  "Resources": {
    "S3BucketForWebsiteContent": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "AccessControl": "PublicRead",
        "WebsiteConfiguration": {
          "IndexDocument": "index.html",
          "ErrorDocument": "error.html"
        },
        "BucketName": { "Ref": "BucketName" }
      }
    },
    "WebsiteCDN": {
      "Type": "AWS::CloudFront::Distribution",
      "Properties": {
        "DistributionConfig": {
          "Comment": "CDN for S3-backed website",
          "Enabled": "true",
          "DefaultCacheBehavior": {
            "ForwardedValues": { "QueryString": "true" },
            "TargetOriginId": "only-origin",
            "ViewerProtocolPolicy": "allow-all"
          },
          "DefaultRootObject": "index.html",
          "Origins": [
            {
              "CustomOriginConfig": {
                "HTTPPort": "80",
                "HTTPSPort": "443",
                "OriginProtocolPolicy": "http-only"
              },
              "DomainName": {
                "Fn::Join": [
                  "",
                  [
                    { "Ref": "S3BucketForWebsiteContent" },
                    {
                      "Fn::FindInMap": [
                        "Region2S3WebsiteSuffix",
                        { "Ref": "AWS::Region" },
                        "Suffix"
                      ]
                    }
                  ]
                ]
              },
              "Id": "only-origin"
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "WebsiteID": {
      "Value": {
        "Ref": "WebsiteCDN" 
      },
      "Description": "The URL of the newly created website"
    }
  }
}





์Šคํƒ ์ƒ์„ฑ

๊ทธ๋Ÿผ ์ด์ œ ์Šคํƒ์„ ๋งŒ๋“ค์–ด๋ณด์ž.
์Šคํƒ์€ CloudFormation์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ๋ฌถ์Œ ๋‹จ์œ„๋‹ค.
๋ฆฌ์†Œ์Šค๋“ค์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ํ•œ๋ฒˆ์— ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ง€์šธ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ƒ์„ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด, ๋ฐฉ๊ธˆ ์ž‘์„ฑํ•œ ํ…œํ”Œ๋ฆฟ ์†Œ์Šค๋ฅผ ์—…๋กœ๋“œํ•œ๋‹ค.


์ด๋ฆ„์„ ์ž˜ ์ง“๊ณ , ํ…œํ”Œ๋ฆฟ์—์„œ ์š”๊ตฌํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

์•„๊นŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•œ ๋ฒ„ํ‚ท๋ช…์ด๋‹ค.

๋‹ค๋ฅธ๊ฑด ์Šฅ์Šฅ ๋„˜๊ฒจ๋„ ๋œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค๋ฉด

ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ํ†ต์งธ๋กœ ๋กค๋ฐฑ์ด ๋˜๊ณ 

์ž˜ ๋œ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ ๋‹ค ๊น”์•„์ค„ ๊ฒƒ์ด๋‹ค.

๋ฒ„ํ‚ท๋„ ๋งŒ๋“ค์–ด์กŒ๊ณ 

CloudFront๋„ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

์ด๋Œ€๋กœ ๋ฒ„ํ‚ท์— ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ฌ๋ ค๋ณด๋ฉด, ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.




์Šคํƒ ์‚ญ์ œ

Cloudformation์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š”, ์‚ญ์ œ๋„ ํ•˜๋‚˜์˜ ์Šคํƒ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์Šคํƒ์„ ์‚ญ์ œํ•˜๋ฉด ๊ทธ ์•ˆ์— ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค๋“ค๋„ ์—ญ์ˆœ์œผ๋กœ ์‚ญ์ œ๊ฐ€ ๋œ๋‹ค.



์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/Welcome.html