Skip to content

์•ˆ๋…•ํ•˜์„ธ์š” Mambo ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ Elastic Beanstalk ๊ตฌ์„ฑ ์‹œ S3 ํ”„๋ผ์ด๋น— ์ €์žฅ์†Œ์—์„œ ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ TLS ์˜คํ”„๋กœ๋“œ์—์„œ Nginx ์—์„œ ์‚ฌ์šฉํ•  SSL ์ธ์ฆ์„œ๋ฅผ Beanstalk ํ™˜๊ฒฝ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ํŒŒ์ผ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ณด์•ˆ์„ ์ค‘์š”์‹œํ•˜๋Š” ํšŒ์‚ฌ๋ผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ๋ฒˆ๋“ค์— ์ธ์ฆ์„œ์™€ ๊ฐœ์ธํ‚ค๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ๋ฒˆ๋“ค์— ์ธ์ฆ์„œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์„ ๋งˆ๋ จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Beanstalk S3 Auth โ€‹

Beanstalk ํ™•์žฅ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ CloudFormation์˜ AWS::CloudFormation::Authentication ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ S3 ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ S3 ์ €์žฅ์†Œ์— ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋น— ํ‚ค๋ฅผ Amazon S3์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ์—์„œ ์•Œ๋ ค์ฃผ๋Š” ๋Œ€๋กœ Beanstalk ๊ตฌ์„ฑ ์‹œ Fn::GetOptionSetting ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

S3 Bucket Policy โ€‹

๋จผ์ €, AWS::CloudFormation::Authentication ๋ฆฌ์†Œ์Šค๋กœ S3 ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก S3 ๋ฒ„ํ‚ท์— ๋ณด์•ˆ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Beanstalk์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ aws-elasticbeanstalk-ec2-role์„ ์ธ์Šคํ„ด์Šค ํ”„๋กœํŒŒ์ผ๋กœ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์„œ ํŒŒ์ผ์ด ์ €์žฅ๋œ S3 ๋ฒ„ํ‚ท์€ ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค๊ฐ€ ์ฐจ๋‹จ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ EC2 ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋„๋ก ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Extend Nginx โ€‹

์ด์ œ ์ด์ „์— ์ž‘์„ฑํ•˜์˜€๋˜ SSL ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ S3์—์„œ ๋ฐ›์•„์˜ค๋„๋ก ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. files ํ‚ค์˜ content ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์Œ์˜ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • source : S3 ์ธ์ฆ์„œ ์˜ค๋ธŒ์ ํŠธ URL
  • authentication : ์ธ์ฆ ์†์„ฑ ์ด๋ฆ„
yaml
Resources:
    AWSEBAutoScalingGroup:
        Metadata:
            AWS::CloudFormation::Authentication:
                S3Auth:
                    type: S3
                    buckets:
                        - mambo-cert
                    roleName:
                        Fn::GetOptionSetting:
                            Namespace: aws:autoscaling:launchconfiguration
                            OptionName: IamInstanceProfile
                            DefaultValue: aws-elasticbeanstalk-ec2-role
files:
    "/etc/nginx/cert/server.crt":
        mode: "000400"
        owner: nginx
        group: nginx
        source: https://mambo-cert.s3.ap-northeast-2.amazonaws.com/server.crt
        authentication: S3Auth
    "/etc/nginx/cert/server.key":
        mode: "000400"
        owner: nginx
        group: nginx
        source: https://mambo-cert.s3.ap-northeast-2.amazonaws.com/server.key
        authentication: S3Auth
    "/etc/nginx/cert/server.ca-bundle":
        mode: "000400"
        owner: nginx
        group: nginx
        source: https://mambo-cert.s3.ap-northeast-2.amazonaws.com/server-ca-bundle
        authentication: S3Auth

commands:
    00-chain-ca-bundle:
        cwd: /etc/nginx/cert
        command: |
            cat server.crt server.ca-bundle > server-ca.pem
            chown nginx:nginx server-ca.pem
            chmod 400 server-ca.pem
    99-remove-bak:
        cwd: /etc/nginx/cert
        command: rm -f *.bak

Beanstalk Resources โ€‹

์•„๋งˆ์กด ์›น ์„œ๋น„์Šค์˜ ๋ฆฌ์†Œ์Šค๋“ค์€ CloudFormation์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉฐ Elastic Beanstalk ํ™˜๊ฒฝ๋„ CloudFormation ์Šคํƒ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

yaml
Resources:
    AWSEBAutoScalingGroup:
        Metadata:
            AWS::CloudFormation::Authentication:
                S3Auth:
                    type: S3
                    buckets:
                        - mambo-cert
                    roleName:
                        Fn::GetOptionSetting:
                            Namespace: aws:autoscaling:launchconfiguration
                            OptionName: IamInstanceProfile
                            DefaultValue: aws-elasticbeanstalk-ec2-role

๊ทธ๋ž˜์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋ฆฌ์†Œ์Šค ํ‚ค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ CloudFormation ํ…œํ”Œ๋ฆฟ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” Beanstalk ํ™˜๊ฒฝ ์‹œ์ž‘ ์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” CloudFormation ์Šคํƒ์— ๋ฏธ๋ฆฌ ์ •์˜๋œ ์›น ์„œ๋ฒ„ ํ™˜๊ฒฝ์˜ ๋ฆฌ์†Œ์Šค ํ•ญ๋ชฉ์ธ AWSEBAutoScalingGroup์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  AWSEBAutoScalingGroup์—๋Š” LaunchConfiguration(AWS::AutoScaling::LaunchConfiguration)๋ผ๋Š” EC2 ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์‹œ์ž‘ ๊ตฌ์„ฑ์„ ์ •์˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉฐ ์‹œ์ž‘ ๊ตฌ์„ฑ์— ์ •์˜๋œ ๋‚ด์šฉ ์ค‘์—๋Š” IamInstanceProfile ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. IamInstanceProfile ์†์„ฑ์€ EC2 ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค ํ”„๋กœํŒŒ์ผ๋กœ ์ง€์ •๋œ IAM Role์— ๋Œ€ํ•œ ์ด๋ฆ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, Beanstalk ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์‹œ ์„ ํƒํ•œ IAM Role์„ ๊ฐ€์ ธ์™€์„œ AWS::CloudFormation::Authentication ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•ด S3 ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ง€์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ž์„œ aws-elasticbeanstalk-ec2-role์ด๋ผ๋Š” IAM Role์ด ์ธ์ฆ์„œ๊ฐ€ ์ €์žฅ๋œ S3 ๋ฒ„ํ‚ท์— ์ฝ๊ธฐ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ํ‚ค์— ์ •์˜๋œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์™ธ๋ถ€ ์†Œ์Šค(S3 ์ €์žฅ์†Œ)์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ๋ฒˆ๋“ค์— ์ธ์ฆ์„œ๋ฅผ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ  EC2 ์ธ์Šคํ„ด์Šค์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” S3 ๋ฒ„ํ‚ท์— ์ธ์ฆ์„œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์„ ๋ณด์‹œ๋Š” ๋ถ„๋“ค์ด ์ธ์ฆ์„œ์˜ ๊ฐœ์ธํ‚ค์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ํŒŒ์ผ๋“ค์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ๋ฒˆ๋“ค์— ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ”„๋ผ์ด๋น— S3 ์ €์žฅ์†Œ์— ์ €์žฅํ•˜์—ฌ ๋” ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Released under the MIT License.