μ•ˆλ…•ν•˜μ„Έμš” 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 : 인증 속성 이름
.ebextensions/nginx-cert.config
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 μŠ€νƒμ„ κ΅¬μ„±ν•˜μ—¬ λ§Œλ“€μ–΄μ§€κ²Œ λ©λ‹ˆλ‹€.

.ebextensions/nginx-cert.config
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 μ €μž₯μ†Œμ— μ €μž₯ν•˜μ—¬ 더 μ•ˆμ „ν•œ λ°©μ‹μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜λŠ” 것을 κ³ λ €ν•΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

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