Elastic Beanstalk Java SE ํ๋ซํผ์ผ๋ก ์คํ๋ง ๋ถํธ ๋ฐฐํฌํ๊ธฐ
์ค๋ ์ 2017๋ ์ ์์ฑํ AWS Elastic Beanstalk Java SE ํ๋ซํผ ํ๊ฒฝ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌํ๊ธฐ ๊ธ์ด ์ง๊ธ์์๋ ์ฐธ๊ณ ํ ๋งํ ์ ๋ณด๊ฐ ์๋๊ฒ ๋ ๋ถ๋ถ์ด ๋ง์์ 2023๋ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฐ๋ฅธ ์ ๋ณด๋ค์ ์ ๋ฆฌํ์ฌ ์์ฑํ ๊ธ์ ๋๋ค.
์๋ง์กด ์น ์๋น์ค์ Elastic Beanstalk ์์ ์ ๊ณตํ๋ Java SE ํ๋ซํผ
์ ์คํ ๊ฐ๋ฅํ๋๋ก ํจํค์ง๋๋ Jar์ War ํ์ผ
์ ํตํด ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ์ ์๋๋ก ์ง์ํ๋ ํ๊ฒฝ์ด๋ค. AWS ์ธํ๋ผ ํ๊ฒฝ์์ Elastic Beanstalk ์๋น์ค๋ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๋ ํ๊ฒฝ์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ตฌ์ฑํ๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๊ณ ๋ ํ ์ฑ๋ฅ ์งํ์ ๋ฐ๋ผ ์คํ ์ค์ผ์ผ๋ง ๋๋ ํ๋ก๋น์ ๋ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค. ๋ณธ ๊ธ์ ํ ๋๋ก Elastic Beanstalk ๊ฒฝํ์ด ๋ถ์กฑํ ์ด๋ณด ๊ฐ๋ฐ์ ๋๋ ํ์ฌ์์ ์๋น์ค๋ฅผ ๋ด๋นํ์ง ์์๋ ๊ฐ๋ฐ์๋ค์ Elastic Beanstalk ํ๊ฒฝ์ผ๋ก ์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ์ ์๋ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ณ ์ด๋ค ๊ณผ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ์ ์๋์ง ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
Elastic Beanstalk UI Console
EB CLI๋ Elastic Beanstalk ์ฝ์ ๋์ ์ ๋ก์ปฌ์์ CLI ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ์ ๋ํ Beanstalk ํ๊ฒฝ ๊ตฌ์ฑ์ ํ ์ ์๊ฒ ์ง์ํ๋ค. ํ์ง๋ง Elastic Beanstalk์ ๋ํ ์์ธํ ์ฉ์ด๋ค์ ์ดํดํ๊ณ ์์ด์ผํ๋ฏ๋ก ์ฒ์์ ์ต์ํ์ง ์์ ๊ฐ๋ฐ์๋ค์ UI ์ฝ์์ ์์กดํ๊ธฐ๋ฅผ ๋ฐ๋๋ค. UI ์ฝ์์ ์ด์ฉํด๋ ์ฒ์์๋ ์ ๋ง์ ์ค๋ฅ๋ค์ ๊ฒฝํํ๊ณ ํ๊ฒฝ์ ์ข ๋ฃํ ๋ค ๋ค์ ๋ง๋ค์ด์ผํ ์ ์๋ค.
์์ ๊ฐ์ด ๋ช ๋ถ ๋ง์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฝ๊ฒ ๋ฐฐํฌํ๊ธฐ ์ด๋ ค์ธ ์ ์๋๋ฐ ๊ทธ ์ฃผ๋ ์ด์ ์๋ ์ ํํ๋ ์ต์ ์ ๋ฐ๋ฅธ ์ ํ๊ณผ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ตฌ์ฑ์ ๋ํด์ ๊ฐ๋ฐ์์๊ฒ ์๋ ค์ฃผ์ง ์๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ฆฌํฐ์ด ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ฌ์ ์ค์ ์ผ๋ก ๋จ์ผ ์ธ์คํด์ค๋ฅผ ์ ํํ ์ ์๋ค๊ณ ๋ ๋์ด์์ง๋ง ์ธ์คํด์ค ์๋ธ๋ท์ด ์์นํ๋ AZ์ ๋ฐ๋ผ ํ๋ฆฌํฐ์ด ๋์์ธ t2.micro ์ ํ์ด ๋ถ๊ฐ๋ฅํ ์ ์๋ค. ํ๋ฆฌํฐ์ด ๊ฐ๋ ์ ๋ํด์ ์ ์ดํดํ๊ณ ์์ง ์์ ๊ฐ๋ฐ์๊ฐ t3.micro๋ฅผ ์ ํํด๋ฒ๋ฆฌ๋ฉด ํ๋ฆฌํฐ์ด ํ๊ฒฝ์ด ์๋ ์ฌ์ฉ์ ์ ์ ํ๊ฒฝ์ผ๋ก ์๋ด ๋ฉ์์ง ์์ด ์ ํ๋๋ค.
์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์์ํ๊ธฐ
์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๊ธฐ ์ํด์ ์น ์๋ฒ ํ๊ฒฝ
๊ณผ Java ํ๋ซํผ ์ ํ
์ ์ ํํ๊ณ ํ๋ก์ ํธ์ ๋ง๋ ์๋ฐ ๋ฒ์ ๊ณผ ํจ๊ป Amazon Linux 2023
๊ทธ๋ฆฌ๊ณ ์ํ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์์ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. Elastic Beanstalk ์ ๋ํด์ ๊ฒฝํ์ด ์์ด๋ CloudFormation์ ์์กดํ๋ Beanstalk ๊ตฌ์ฑ์ ํน์ฑ ์ ์ฒ์๋ถํฐ ํ๊ฒฝ์ด ๊ตฌ์ฑ๋์ง ์์ ์๋ ์๋ค.
์ฐธ๊ณ ๋ก Amazon Linux 2์ 2025๋ ์ง์ ์ข ๋ฃ(EOL) ์์ ์ด๋ฏ๋ก ํ๊ฒฝ ๊ตฌ์ฑ ํ์ฅ ์ ํจํค์ง ์ค์น๊ฐ ์ด๋ ต๋ค๋ฉด Amazon Linux 2๋ฅผ ์ ํํด๋ ์์ง๊น์ง๋ ๊ด์ฐฎ์ต๋๋ค. ๋ํ, Elastic Beanstalk ํ๊ฒฝ ๊ตฌ์ฑ์ ์๋ฃํ์ด๋ ์ฌ๋ฌ๋ฒ ํ๊ฒฝ์ ์ฌ ๊ตฌ์ฑํด๋ณด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ ๋จ์ผ Jar ํ์ผ ๋ณด๋ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์ ๊ตฌ์ฑํ์ฌ ์ ๋ก๋ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ์ผ๋ฐ์ ์ผ๋ก JVM Option ์ ์ ์ฉํ ํ์๊ฐ ์๊ธฐ๋ฏ๋ก Procfile์ ๊ธฐ๋ณธ์ ์ธ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ช ๋ น์ด๋ฅผ ์ ์ํด๋๊ณ ํ๊ฒฝ ์์ฑ์ ํตํด ์ฌ์ฉ์ ์ ์ํ๋ ๊ตฌ์ฑ์ ์ถ์ฒํ๋ค.
web: java -Dfile.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -Xmx1g -jar app.jar
๊ณต์ ๋ฌธ์์ ํฌํจ๋์ด์๋ ๋ด์ฉ์ ์๋์ง๋ง ์๋ฐ ์ต์ ์ _JAVA_OPTIONS ๋๋ JAVA_TOOL_OPTIONS ํ๊ฒฝ ์์ฑ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ตณ์ด ์๋ฐ ์ต์ ์ ์กฐ์ ํ๊ธฐ ์ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์ Procfile์ ์์ ํ ํ์๋ ์๋ต๋๋ค. Elastic Beanstalk Configuration files(.ebextensions)์์๋ ๋ด๋ ๋ฆญ ์๋ฐ ์์ด์ ํธ๋ฅผ ์คํํ๊ธฐ ์ํด์ Procfile์ ์ ์ํ์ง๋ง JAVA_TOOL_OPTIONS ํ๊ฒฝ ์์ฑ์ ์ด์ฉํ๋ ๊ฒ์ด ๋ ์ ์ฐํ ๊ตฌ์ฑ์ด ๋ ๊ฒ๋๋ค.
์๋น์ค ์ก์ธ์ค ๊ตฌ์ฑ
Elastic Beanstalk ์ด ๊ฐ๋ฐ์ ๋์ ์ EC2 ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ์คํ ์ค์ผ์ผ๋ง์ด ๊ฐ๋ฅํ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด์๋ ์๋น์ค ์ญํ ๋ฟ๋ง ์๋๋ผ E2 ์ธ์คํด์ค ํ๋กํ์ผ์ ๋ํ IAM ์ด ํ์ํ๋ค. ์์ ์๋ EC2 ์ธ์คํด์ค ํ๋กํ์ผ์ ์ฌ์ฉ๋ ์ญํ ๋ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ์์ผ๋ AWS ๋ณด์ ์ ์ฑ
๋ณ๊ฒฝ์ผ๋ก ์ธํด aws-elasticbeanstalk-ec2-role
์ ๋ง๋ค์ด์ฃผ์ง ์๋๋ค๊ณ ํ๋ค. (์ฐธ๊ณ - https://stackoverflow.com/a/76620598)
aws-elasticbeanstalk-service-role
์๋น์ค ์ญํ ์ ์๋ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ์ ์ด๋ฏธ์ง์ ๋ค๋ฅด๊ฒ AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy ๊ฐ ์ ์ฑ ์ผ๋ก ํฌํจ๋๋ ๊ฒ ๊ฐ๋ค์. AWSElasticBeanstalkService ๊ฐ ํฌํจ๋์ด์๋ค๋ฉด ์ค๋์ ์ ์ด๋ฏธ ์์ฑํ์์ ์๋ฏธํฉ๋๋ค.
aws-elasticbeanstalk-ec2-role
EC2 ์ธ์คํด์ค ํ๋กํ์ผ๋ก ์ง์ ํ๋ IAM ์ญํ ์๋ ์ ๋ขฐํ ์ ์๋ ์ํฐํฐ๋ก ec2.amazonaws.com ์๋น์ค๋ฅผ ๋ฑ๋กํด์ผํ๋ฉฐ ๊ตฌ์ฑํ๊ณ ์ ํ๋ ํ๊ฒฝ์ ๋ฐ๋ผ ์๋์ ์ธ๊ฐ์ง ์ ์ฑ ์ ๊ถํ์ผ๋ก ๋ฑ๋กํด์ผํ๋ค. ์ด์ ๋ํ ์ ๋ณด๋ Elastic Beanstalk ์ธ์คํด์ค ํ๋กํ์ผ ๊ด๋ฆฌ์ ์ค๋ช ๋์ด์๋ค.
- AWSElasticBeanstalkWebTier
- AWSElasticBeanstalkWorkerTier
- AWSElasticBeanstalkMulticontainerDocker
๊ธฐ๋ณธ์ ์ผ๋ก๋ aws-elasticbeanstalk-service-role ๊ณผ aws-elasticbeanstalk-ec2-role ์ด๋ผ๋ ์ด๋ฆ์ ์ญํ ์ ์ฐพ์ ์ ํํด์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ง์ฝ ๋ณ๋์ ์ด๋ฆ์ ๊ฐ์ง IAM ์ญํ ์ ๋ง๋๋ ๊ฒฝ์ฐ์๋ ์๋ชป ์ ํํ์ง ์๋๋ก ์ฃผ์ํด์ผํฉ๋๋ค. ์น UI ์ฝ์์์๋ ์๋ชป๋ IAM ์ญํ ์ ์ ํํ๋ ๊ฑธ ๊ฒ์ฆํด์ฃผ์ง ์์ต๋๋ค.
ํผ๋ธ๋ฆญ ์๋ธ๋ท
๋จ์ผ ์ธ์คํด์ค๊ฐ ์๋ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ํตํด ์คํ ์ค์ผ์ผ๋ง์ด ๊ฐ๋ฅํ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ์ง์ ํ๋ ๊ฒ์ ์ฃผ์ํด์ผํ ํ์๊ฐ ์๋ค. UI ์ฝ์๋ ๋ชจ๋ ๊ฒ์ ์น์ ํ์ง๋ ์์์ ๊ฐ์์ฑ์ ํผ๋ธ๋ฆญ์ผ๋ก ์ ํํ๋๋ผ๋ ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ํ๋ผ์ด๋น ์๋ธ๋ท๋ ์ ํ ์ต์ ์ผ๋ก ๋ ธ์ถ๋๋ฏ๋ก ํผ๋ธ๋ฆญ ์๋ธ๋ท์ด ์๋ ๊ฒ์ ์ ํํ์ง ์๋๋ก ์ฃผ์ํด์ผํ๋ค.
- ๋จ์ผ ์ธ์คํด์ค์ด๋ฉด์ ์ธ์คํด์ค ์๋ธ๋ท์ด ํ๋ผ์ด๋น ์๋ธ๋ท์ผ๋ก ์ง์ ๋๋ ๊ฒฝ์ฐ - ํ๊ฒฝ ์์ฑ ๋ถ๊ฐ
- ๊ณ ๊ฐ์ฉ์ฑ ์ค์ ์ด๋ฉด์ ๋ก๋๋ฐธ๋ฐ์ ์๋ธ๋ท์ด ํ๋ผ์ด๋น ์๋ธ๋ท์ผ๋ก ์ง์ ๋๋ ๊ฒฝ์ฐ - ํ๊ฒฝ ์์ฑ ๊ฐ๋ฅ
์ฌ๋ฐ๋ฅธ ๊ฐ์ฉ ์์ญ์ ์๋ธ๋ท์ผ๋ก ๊ตฌ์ฑํ๋์ง VPC ๊ตฌ์ฑ์ ๊ฒํ ํ์ ์ผํฉ๋๋ค. ์ธ์คํด์ค ์๋ธ๋ท๊ณผ ๋ก๋๋ฐธ๋ฐ์ ์๋ธ๋ท ๋ชจ๋ ์๋ชป๋ ์๋ธ๋ท์ ์ ํํ๋ ๊ฒ์ UI ์น ์ฝ์์์๋ ๊ฒ์ฆํด์ฃผ์ง ์์ต๋๋ค. ํ๊ฒฝ์ด ๋ง๋ค์ด์ง๋๋ผ๋ Elastic Beanstalk ์์๋ ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์ด๋ ค์ธ ์ ์์ด ์ฃผ์ํด์ผํ ์ ํ ํญ๋ชฉ์ ๋๋ค.
์ธ์คํด์ค ๋ฃจํธ ๋ณผ๋ฅจ
์ธ์คํด์ค ํธ๋ํฝ ๋ฐ ํฌ๊ธฐ ์กฐ์ ๊ตฌ์ฑ ๋ฉ๋ด์์ ์ ํ์ฌํญ์ด๊ธด ํ๋ ๋ฃจํธ ๋ณผ๋ฅจ์ ํฌ๊ธฐ๊ฐ 8GB ์ธ ๊ฒ์ ์ฃผ์ํ ํ์๊ฐ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก 8GB ์ด์ด๋ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐ๋์ง๋ง ์๊ธฐ์น ์์ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๋ฒ์ฉ 3(SSD) ๋ฐ 30GB ์ด์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ์๋น์ค(IMDS)๋ IMDSv2๋ฅผ ์ฌ์ฉํ๋๋ก IMDSv1 ๋นํ์ฑํ ์ ํ ๊ธฐ๋ณธ๊ฐ์ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฑธ ๊ถ์ฅํฉ๋๋ค. ์ธ์คํด์ค ๋ฉํ๋ฐ์ดํฐ ์๋น์ค๋ ํ๋ซํผ ํ์ฅ ์ ์ธ์คํด์ค ์ ๋ณด๋ฅผ ์กฐํํ๋๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ๋ค๋ฉด Beanstalk Linux ํ๋ซํผ ํ์ฅ์ ๋ํด์ ๊ธ์ ์ฐธ์กฐํ์ธ์.
EC2 ์ธ์คํด์ค ํ์ธ
Elastic Beanstalk ํ๊ฒฝ์ ์ด๋ฒคํธ์ ํ๊ฒฝ ๊ตฌ์ฑ์ ๋ํ ์ฑ๊ณต ๋ฉ์์ง๋ฅผ ํ์ธํ๋ค๋ฉด ๋๋ฉ์ธ ์ฃผ์๋ฅผ ํด๋ฆญํ์ฌ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ Congratulations ํ๋ฉด์ด ๋ ธ์ถ๋๋์ง ํ์ธํด์ผํ๋ค. ํ๊ฒฝ์ด ์์ฑ๋์์ด๋ ๊ตฌ์ฑ ์ ์ด์ํ ์ค์ ์ด ์๋ค๋ฉด EC2 ์ธ์คํด์ค์ ์ ์ํ์ฌ eb-engine(/var/log/eb-engine.log)๋ฅผ ์ดํด๋ณด์์ผ ํ๋ค. ๋ค์๊ณผ ๊ฐ์ด /opt/elasticbeanstalk/bin/get-config ๋๊ตฌ๋ก EC2 ์ปจํ ์ด๋์์ ์ดํด๋ณด์์ผํ ๋ก๊ทธ ํ์ผ ๋ชฉ๋ก์ ์ ์ ์๋ค.
[root@ip-10-0-2-119 ~]# /opt/elasticbeanstalk/bin/get-config --output YAML container
common_log_list:
- /var/log/eb-engine.log
- /var/log/eb-hooks.log
default_log_list:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
- /var/log/web.stdout.log
environment_name: Ss-env
instance_port: "80"
log_group_name_prefix: /aws/elasticbeanstalk
proxy_server: nginx
static_files:
- ""
xray_enabled: "false"
ํ๊ฒฝ ์์ฑ์ด ์๋ฃ๋์์๋๋ eb-engine ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๊ณ ์ด๋ป๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋์ง ํ์ธํด๋ณด๋๊ฒ ์ข์ต๋๋ค. Java SE ํ๋ซํผ ํ๊ฒฝ์์๋ Nginx๋ฅผ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก ๊ตฌ์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด 5000 ํฌํธ๋ก ์คํ๋๋ค๋ ๊ฐ์ ์ผ๋ก ํธ๋ํฝ์ ์ ๋ฌํฉ๋๋ค. ์ฐธ๊ณ ๋ก ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ EC2 ์ธ์คํด์ค ๋ด์์ ๋น๋๋์ด ์คํ๋๋ ๊ฒ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ๋ฐ ๋ฐฐํฌ
์ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๊ฐ ์๋ฃ๋์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ ์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ ๋ฐฐํฌํด์ผํ๋ค. ์์ง๊น์ง๋ ํ๋ซํผ ํ์ฅ์ด ํ์ํ์ง ์๋ค๋ ๊ฐ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจํค์งํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์ ์์ถ ํ์ผ๋ก ๋ง๋๋ ๊ฒ์ ์์๋ณด์. ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์๋ Procfile๊ณผ ์คํ ๊ฐ๋ฅํ๋๋ก ํจํค์ง๋ Jar ๋๋ War ํ์ผ์ ํฌํจํ์ฌ์ผ ํ๋ค.
- Procfile
- application.jar
์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์ ์์ถ ๋ช ๋ น์ด๋ก๋ ๋ง๋ค ์ ์์ผ๋ Gradle ์ ์ฌ์ฉ์ค์ด๋ผ๋ฉด Zip ํ์คํฌ๋ฅผ ์ด์ฉํด์ Beanstalk ๋ฐฐํฌ๋ฅผ ์ํ ๋น๋ ํ์คํฌ๋ฅผ ๋ง๋ค์ด์ ์คํํ ์ ์๋ค. ๋ค์์ gradle-8.5 ๊ธฐ์ค์ผ๋ก ์์ฑํ ํ์คํฌ ์์์ด๋ค.
tasks.register('procfile') {
bootJar.archiveFileName.set('application.jar')
dependsOn 'bootJar'
doFirst {
new File("build/libs", "Procfile").text = "web: java -jar ${bootJar.archiveFileName.get()}"
}
}
tasks.register('zipSourceBundle', Zip) {
dependsOn 'clean'
dependsOn 'procfile'
from('build/libs') {
include('application.jar')
include('Procfile')
}
archiveBaseName = 'beanstalk'
}
./gradlew zipSourceBundle
๋ค๋ฅธ Elastic Beanstalk ๊ด๋ จ ๊ธ๊ณผ๋ ๋ค๋ฅด๊ฒ Procfile์ JVM ์ต์ ์ ์ ์ํ์ง ์์๋๋ฐ Java SE ํ๋ซํผ์ JVM ํน์ฑ ์ ์๋ฐ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ๋ณ๋๋ก ์ฃผ์ ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. Elastic Beanstalk ๋ฌธ์์๋ ๋ณ๋๋ก ๊ธฐ์ฌ๋์ด์์ง๋ ์์ง๋ง JVMTI ํ์ค ์คํ์ธ JAVA_TOOL_OPTIONS ๋๋ _JAVA_OPTIONS ํ๊ฒฝ ๋ณ์๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ ์์ฑ
์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์ ์ ๋ก๋ํ๊ธฐ ์ ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ์ค์ธ ์ํ์์ ํ๊ฒฝ ์์ฑ์ ๋จผ์ ๋ฑ๋กํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. ์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์๋ ํ๋กํ์ผ ์ง์ ์ด๋ JVM ์ต์ ์ ์ ์ํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋ ์ ์๋๋ก ํด์ผํ๋ค. ๊ตฌ์ฑ โ ์ ๋ฐ์ดํธ, ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น โ ํ๋ซํผ ์ํํธ์จ์ด โ ํ๊ฒฝ ์์ฑ์ JAVA_TOOL_OPTIONS๋ฅผ ์ถ๊ฐํ์. ํ๊ฒฝ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ EC2 ์ธ์คํด์ค๋ฅผ ์ข ๋ฃํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๊ณผ์ ๋ง ๋ค์ ์ํํ๊ฒ ๋๋ค.
[root@ip-10-0-2-119 ~]# jps -v
6226 Jps -Dapplication.home=/usr/lib/jvm/java-17-amazon-corretto.x86_64 -Xms8m -Djdk.module.main=jdk.jcmd
6148 sample-app-1.0-jar-with-dependencies.jar -Dfile.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -Xms250m -Xmx250m
์ ์ด๋ฏธ์ง ์์๋ JAVA_TOOL_OPTIONS ์ _JAVA_OPTIONS๋ฅผ ํ์ฉํ ์ ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ณ๋๋ก ๋๋์ด์ ์ฌ์ฉํ์ต๋๋ค. ํผ์ฉํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ JAVA_TOOL_OPTIONS์ด ๋จผ์ ๋์ด๋๊ณ ๊ทธ ๋ค์์ _JAVA_OPTIONS ์ด ์ ์ฉ๋๋ฏ๋ก ์์์ ์ฃผ์ํด์ผํ ํ์๊ฐ ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก๋ JAVA_TOOL_OPTIONS ๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
ํ๋ซํผ ํ์ฅ - ๋ฆฌ๋ฒ์ค ํ๋ก์ ๊ตฌ์ฑ
์ ํ๋ฆฌ์ผ์ด์ ์ด 5000 ํฌํธ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด PORT ํ๊ฒฝ ๋ณ์๋ก ์ง์ ํ๊ฑฐ๋ ๋ฆฌ๋ฒ์ค ํ๋ก์ ๊ตฌ์ฑ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ณธ Nginx ์ค์ ์ ๋์ฒดํ ์ ์๋ค. Beanstalk Linux ํ๋ซํผ ํ์ฅ์ ๋ํด์ ์ฒ๋ผ ์๋์ ๋๊ฐ์ ํ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ฒ๋ค์ ํฌํจ์์ผ๋ ๋๋ค.
upstream web {
server 127.0.0.1:5000;
keepalive 1024;
}
location / {
proxy_pass http://web;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
tasks.register('zipSourceBundle', Zip) {
dependsOn 'clean'
dependsOn 'procfile'
from('build/libs') {
include('application.jar')
include('Procfile')
}
from('beanstalk') {
include('.platform/nginx/conf.d/upstream.conf')
include('.platform/nginx/conf.d/elasticbeanstalk/00_application.conf')
}
archiveBaseName = 'beanstalk'
}
๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ nginx.conf ์ ์์กดํ๋ ๋ฏธ๋ฆฌ ์ ์๋์ด์๋ 00_application.conf ํ์ผ์ด ๋์ฒด๋๋๋ก zipSourceBundle ํ์คํฌ๋ฅผ ์์ ํ์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ์ฑ๊ณตํ์๋ค๋ฉด ๋๋ฉ์ธ ์ฃผ์ ๋๋ EC2 ์ธ์คํด์ค์ ์ ์ํด๋ณด๋ฉด ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐ๋ฆฌ๊ฐ ํจํค์งํ์ฌ ์ ๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ํ์ผ์ด ์คํ๋๊ณ ์์์ ํ์ธํ ์ ์๋ค.
[root@ip-10-0-2-119 ~]# jps -v
6964 application.jar -Dfile.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -Xms250m -Xmx250m
7109 Jps -Dapplication.home=/usr/lib/jvm/java-17-amazon-corretto.x86_64 -Xms8m -Djdk.module.main=jdk.jcmd
์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ์๋ฃํ๋ค๋ฉด Beanstalk Linux ํ๋ซํผ ํ์ฅ์ ๋ํด์๋ฅผ ์ฐธ๊ณ ํด๋ณด์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ํฉํ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค.
Elastic Beanstalk ์์ํ๊ธฐ ํธ๋ฌ๋ธ ์ํ
์ธ์คํด์ค ์๋ธ๋ท์ ๊ฐ์ฉ ์์ญ์์ ์ง์ํ์ง ์๋ EC2 ์ ํ ๋ฌธ์
Elastic Beanstalk ํ๊ฒฝ ๊ตฌ์ฑ ์ ์ธ์คํด์ค ์๋ธ๋ท์ผ๋ก ์ ํํ ๊ฐ์ฉ ์์ญ ๋ชฉ๋ก์ ๋ฐ๋ผ์ ์ง์ํ์ง ์๋ EC2 ์ ํ์ ์ ํํ ์ ์๋ค. ๋ค๋ง, x86_64 ์ํคํ ์ฒ๋ฅผ ์ ํํด๋์ด๋ arm ์ํคํ ์ฒ์ ํด๋นํ๋ XXg ์ธ์คํด์ค ์ ํ์ด ๋ชฉ๋ก์ ํ์๋์ด ์ ํํ ์ ์์ง๋ง ํ๊ฒฝ ์์ฑ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ํ์ธ์ ์๊ตฌํ๋ค. ๋ํ, ํ๋ฆฌํฐ์ด ์ฌ์ฉ์์ ๊ฒฝ์ฐ ๋จ์ผ ์ธ์คํด์ค(ํ๋ฆฌํฐ์ด ์ฌ์ฉ ๊ฐ๋ฅ) ์ฌ์ ์ค์ ์ ์ ํํ๋ ๊ฒฝ์ฐ์๋ ์ธ์คํด์ค ์๋ธ๋ท์ด ap-northeast-2a ๋ง ์ ํ๋์ด์์ง ์๋๋ค๋ฉด ํ๋ฆฌํฐ์ด ๋์์ธ t2.micro ์ ํ์ ์ ํํ ์ ์๋ค.
ํ๋ฆฌํฐ์ด ์ฌ์ฉ์๊ฐ ๋จ์ผ ์ธ์คํด์ค๋ก ์ ํํ๊ณ ๋์ ์ธ์คํด์ค ์๋ธ๋ท์ ์๋ชป ์ง์ ํ๋๋ผ๋ t3.micro ์ t3.small ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํํ๊ณ ์์ต๋๋ค. ์ฌ์ฉ์ ๊ฒฝํ ์ ap-northest-2a ๋ฅผ ์ ํํ๋๋ผ๋ t2.micro๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋ถ์ฌํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผํ ์ ํ ํญ๋ชฉ์ ํด๋นํฉ๋๋ค.
ํ๊ฒฝ ์์ฑ ์ดํ์๋ ํ๋ก์ธ์ ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ์ธ์คํด์ค ์ ํ์ด ์ ํ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ด์ผ ํ๋ค. ํ๊ฒฝ์ ์์ฑํ ๋น์์๋ ์ ํ๋ ์ํคํ ์ฒ ์ด์ธ์ ์ง์ํ์ง ์๋ EC2 ์ธ์คํด์ค ์ ํ๋ ์ ํํ ์ ์๋๋ก ๋ชฉ๋ก์๋ ํ์๋๊ณ ์์ด ์ฃผ์๊ฐ ํ์ํ๋ค. ํ๋ก์ธ์ ์ํคํ ์ฒ๋ฅผ arm64 ๋ก ์ ํํ๋ ๊ฒฝ์ฐ์๋ ์ ํ๋ AZ์ ap-northeast-2d ๊ฐ ํฌํจ๋์ด์๋ค๋ฉด ์ง์ํ์ง ์๋ ์ ํ์ t4g๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ t4g.micro๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ํํด์ฃผ์ง ์๋๋ค.
์ธ์คํด์ค ์๋ธ๋ท๊ณผ ๋ก๋๋ฐธ๋ฐ์ ์๋ธ๋ท์ ํผ๋ธ๋ฆญ ์ฌ๋ถ ๋ฌธ์
์ธ์คํด์ค ์๋ธ๋ท๊ณผ ๋ก๋๋ฐธ๋ฐ์ ์๋ธ๋ท ๋ชจ๋ ํผ๋ธ๋ฆญ์ผ๋ก ์ ํํ๋ ๊ฒ์ ์ธํฐ๋ท ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ด๋ฏ๋ก ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด์ ์ฐ๊ฒฐ๋์ด์๋ ํผ๋ธ๋ฆญ ์๋ธ๋ท์ ์ง์ ํด์ผํ๋ค. ์น UI ์ฝ์ ์ ์ ํํ๋ ์๋ธ๋ท์ด ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๊ฐ ์ฐ๊ฒฐ๋์๋์ง๊น์ง๋ ํ์ธํด์ฃผ์ง ์์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅด์ง ์์ ๊ตฌ์ฑ์ผ๋ก ํ๊ฒฝ ์์ฑ์ ์์ํ ์ ์๋ค. ๋ง์ผ, ๋จ์ผ ์ธ์คํด์ค๋ก ํผ๋ธ๋ฆญ ์ฒดํฌ๋ฅผ ํ ํ ์ธ์คํด์ค ์๋ธ๋ท์ ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๊ฐ ์ฐ๊ฒฐ๋์ง ์์ ํ๋ผ์ด๋น ์๋ธ๋ท์ผ๋ก ์ ํํ๋ ๊ฒฝ์ฐ Elastic Beanstalk ์ด ํ๊ฒฝ ์์ฑ์ ์๋ํ๋ค๊ฐ ๋ฉ์ถ๋ ์ํฉ์ ๋ง๋ ์ ์๋ค.
The EC2 instances failed to communicate with AWS Elastic Beanstalk, either because of configuration problems with the VPC or a failed EC2 instance. Check your VPC configuration and try launching the environment again.
Elastic Beanstalk ์ด ํ๊ฒฝ ์์ฑ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ง์ CloudFormation ์์ ํด๋น ์คํ์ ์ฐพ์ ์ญ์ ๋ฅผ ์๋ํด์ผํฉ๋๋ค. Elastic Beanstalk ์๋น์ค๊ฐ CloudFormation ์ ์ํ ์ฝ๋ ๊ธฐ๋ฐ ๊ตฌ์ฑ์ ์์กดํ๊ธฐ ๋๋ฌธ์ด๋ฉฐ Elastic Beanstalk ์ด ํ๊ฒฝ์ ์ ๋ฐ์ดํธํ๋ ๋์ค์๋ ์น UI ์ฝ์ ๊ธฐ๋ฅ์ด ์ ํํด๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ํ ๋ณด๊ณ ๊ธฐ๋ณธ ์ ํ ์ ๊ด๋ฆฌํ ์ ๋ฐ์ดํธ ์ค์ ๋ถ๊ฐ
์ํ ๋ณด๊ณ ์ต์
์ ์์คํ
๊ฐํ๋จ
์์ ๊ธฐ๋ณธ์ผ๋ก ์ ํํ๊ณ ๋์ ๊ด๋ฆฌํ ์
๋ฐ์ดํธ
๋ฅผ ํ์ฑํ๋ฅผ ์ ์งํ๋ ๊ฒฝ์ฐ UI ์ฝ์ ์ ์ค๋ช
์ ์ ๊ณตํ์ง ์์๋ ํ๊ฒฝ ์์ฑ ์๋ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ด๋ฆฌํ ์
๋ฐ์ดํธ๋ฅผ ์ค์ ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ์ํ ๋ณด๊ณ ๋ฅผ ์์คํ
๊ฐํ๋จ์ผ๋ก ์ค์ ํด์ผํ๋ค.
Invalid option specification (Namespace: 'aws:elasticbeanstalk:managedactions', OptionName: 'ManagedActionsEnabled'): Managed platform updates require enhanced health reporting (option SystemType in namespace aws:elasticbeanstalk:healthreporting:system).
Elastic Beanstalk ํ๊ฒฝ ๊ตฌ์ฑ์ ๋ํ์ฌ
๋ง์ ๊ฐ๋ฐ์๋ค์ด Elastic Beanstalk ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ํ ๊ธ์ ์ฐธ๊ณ ํ๋ฉฐ ๋ฐ๋ผํ๊ฒ ์ง๋ง ๋ฆฌ๋ ์ค ์ปค๋ ํ๋์ด๋ ๋ฆฌ๋ฒ์ค ํ๋ก์ ๊ตฌ์ฑ๊ณผ ๊ฐ์ ํ๋ซํผ ํ์ฅ์ ๋ํด์๋ ๋จ์ํ ๋ฐ๋ผํ๊ธฐ๋ณด๋ค๋ ๊ทธ๊ฒ์ด ๋ฐ๋์ ํ์ํ์ง๋ฅผ ๊ณ ๋ฏผํด๋ณผ ํ์๊ฐ ์๋ค. ์ค๋๋ ๊ธ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ต์ ๋ฆฌ๋ ์ค ์ปค๋์ ๊ฒฝ์ฐ์๋ ๋ฆฌ๋ ์ค ์ปค๋ ํ๋ผ๋ฏธํฐ ์กฐ์ ์ด ํ์ํ์ง ์์ ์ ๋๋ก ๊ธฐ๋ณธ๊ฐ์ด ์ค์ ๋์ด์๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด์์ ๋ฌธ์ ๊ฐ ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๋ฆฌ๋ ์ค ์์คํ ์ ์ต์ ํํ๋ค๊ณ ์๋ํด๋์ผ๋ฉด ์ ๊ทธ ์ค์ ์ด ํ์ํ์ง ์ดํดํ์ง ๋ชปํ๋ ํ๊ฒฝ์ ๋ง๋ค๊ฒ ๋๋ค.
๋ํ, ์ธ์ ๋ Elastic Beanstalk ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ ์ ์๊ธฐ์น ์์ ์ํฉ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ์ ๋ํ ์์ธ์ ์ฐพ์๊ฐ๊ธฐ ์ฝ๋๋ก ์ด๋ค ์ ๋ณด๋ค์ ์ฐธ๊ณ ํ ์ ์๋์ง๋ฅผ ๋ฏธ๋ฆฌ ์ธ์งํ๋๊ฒ ์ข๋ค. ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก๋ Elastic Beanstalk ์์ ์ ๊ณตํ๋ ์ด๋ฒคํธ ์ ๋ณด๋ก ๊ตฌ๋ณํ ์ ์๊ณ ๋ ๋์๊ฐ์๋ ์ง์ EC2 ์ธ์คํด์ค๊น์ง ์ ๊ทผํ ์ ์๋ ๋ฐฉ์์ ๋ง๋ จํด๋๋ ๊ฒ์ด ํ์ํ๋ค. Elastic Beanstalk ํ๊ฒฝ์์ Amazon EC2 ์ธ์คํด์ค ๋ก๊ทธ ๋ณด๊ธฐ๋ ์ง์ EC2 ์ธ์คํด์ค์ ์ ๊ทผํ์ง ์์๋ ์ผ๋ จ์ ๋ก๊ทธ๋ค์ ์กฐํํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์ด๋ค ๊ธฐ์ ์ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋์ผํ ๊ฒฝํ์ ํ ์ ์๋๊ฒ ์๋๋ฏ๋ก ์ง์์ ์ธ ํ์ต์ ์ค์ํ ๋ฏ ์ถ๋ค.