Bibi's DevLog ๐ค๐
[Spring boot] ์คํฌ๋ฆฝํธ์ S3 bucket์ ์ด์ฉํ ์คํ๋ง ์ฑ ๋ฐฐํฌ ์๋ํ(+ ์ฌ๋ ๋ด, crontab ํ์ฉ) ๋ณธ๋ฌธ
[Spring boot] ์คํฌ๋ฆฝํธ์ S3 bucket์ ์ด์ฉํ ์คํ๋ง ์ฑ ๋ฐฐํฌ ์๋ํ(+ ์ฌ๋ ๋ด, crontab ํ์ฉ)
๋น๋น bibi 2021. 6. 2. 23:50์คํฌ๋ฆฝํธ์ S3 bucket์ ์ด์ฉํ ์คํ๋ง ์ฑ ๋ฐฐํฌ ์๋ํ(+ ์ฌ๋ ๋ด, crontab ํ์ฉ)
yeon์ด ์ค๋ ํ๋ก์ ํธ์์ ๊ฐ๋ฅด์ณ ์ฃผ์ ๋ฐฐํฌ์๋ํ ๊ณผ์ ์ ์ ๋ฆฌํด ๋ณด์๋ค! ๐โโ๏ธ
(์ถ์ฒ : S3 bucket์ ์ด์ฉํ ๋ฐฐํฌ ์๋ํ)
๋ค์๊ณผ ๊ฐ์ ์๋ํ๋ฅผ ํ๊ฒ ๋๋ค.
- ๋ก์ปฌ์์ ๋น๋ํ ์คํ๋ง ์ฑ์ ๋น๋ ํ์ผ(jar)์ S3์ ๋ฃ๊ธฐ
- ์ธ์คํด์ค๊ฐ s3๋ฅผ 1๋ถ๋ง๋ค ์ฒดํฌ
- ๋น๋ ํ์ผ์ด ์๋ก์ด ๋ฒ์ ์ด๋ฉด s3์์ ๋น๋ ๋ฐ ๋ฐฐํฌ
[์ค๋น๋ฌผ] ์ ๋์๊ฐ๋ ์คํ๋ง ์ฑ, aws ๊ณ์ ๊ณผ ec2 ์ธ์คํด์ค, ์ฌ๋
(๋ก์ปฌ) ์คํ๋ง ์ฑ์ ๋น๋ํด jarํ์ผ์ ์์ฑํจ
- ํ๋ก์ ํธ ํด๋์์
./gradlew build jar
- ํ๋ก์ ํธ ํด๋์์
(ec2) S3์์ ๋ฐฐํฌ์ฉ bucket ์์ฑ
- aws์๋น์ค ์ค s3 ์ ํ - ๋ฒํท - ๋ฒํท ๋ง๋ค๊ธฐ
- ๋ฒํท ์์ฑ์ ์ด๋ฆ์ด ๋ค๋ฅธ ๋ฒํท๊ณผ ์ค๋ณต๋๋ฉด ์ ๋จ
- ๊ธฐ๋ณธ์ต์ ๊ทธ๋๋ก ๋ง๋ค๊ธฐ
(๋ก์ปฌ) aws cli ์ค์น
- aws ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ค์นํจ.
- https://velog.io/@trycatch/AWS-CLI-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0 ๋ฅผ ์ฐธ๊ณ ํด ์ค์นํ ๋ค์,
- ์๋์ฐ๋ ์ ๋งํฌ๋ฅผ ์ฐธ์กฐํด ์ค์น ํ๋ก๊ทธ๋จ ๋ค์ด๋ก๋, ๋งฅ/Linux๋
sudo apt install awscli
- ๋งฅ/๋ฆฌ๋
์ค ์ค์น๊ฐ ์ ๋ ์
sudo apt update
๋ฅผ ํตํด ์ ๋ฐ์ดํธ ํ ๋ค์ ๋ค์ ์๋ํด ๋ณด๊ธฐ
- ์๋์ฐ๋ ์ ๋งํฌ๋ฅผ ์ฐธ์กฐํด ์ค์น ํ๋ก๊ทธ๋จ ๋ค์ด๋ก๋, ๋งฅ/Linux๋
- https://lovemewithoutall.github.io/it/aws-cli-configure/ ๋ฅผ ์ฐธ๊ณ ํด ์ด๊ธฐ ์ค์ ์ ๋ง์น๊ธฐ. (IAM์ ๋ง๋ค ๋ ์์ฑ๋๋ AWS Access Key ID, AWS Secret Access Key ํ์)
(๋ก์ปฌ -> ec2) jarํ์ผ์ S3 ๋ฒํท์ผ๋ก ๋ณต์ฌ
- jarํ์ผ์ด ์๋ ์์น๋ก ์ด๋(๋ณดํต ํ๋ก์ ํธ ํ์ผ์์
cd /build/libs
) aws s3 cp jarํ์ผ๋ช .jar s3://๋ฒํท์ด๋ฆ/ํ์ผ์ด๋ฆ.jar
- *
ํ์ผ์ด๋ฆ
์ ๊ฒฝ์ฐ, ๋ณต์ฌ๋ฅผ ํตํด ์๋ก ์์ฑ๋๋ ํ์ผ ์ด๋ฆ์ ๋ปํจ. ์ง์ ์ง์ ํด ์ฃผ๋ฉด ๋๋ค. aws s3 ls s3://๋ฒํท์ด๋ฆ
์ผ๋ก s3๋ฒํท์ ์ ๋ค์ด๊ฐ๋์ง ํ์ธํ ์ ์๋ค.
- jarํ์ผ์ด ์๋ ์์น๋ก ์ด๋(๋ณดํต ํ๋ก์ ํธ ํ์ผ์์
(ec2 - Role) s3 access ์ ์ฑ ์ด ์ฐ๊ฒฐ๋ Role(์ญํ ) ์ถ๊ฐ ๋ฐ ec2 ์ธ์คํด์ค์ ๋ฑ๋ก
- ec2 ์ธ์คํด์ค์ ์ ์ ํ, 3.์ ๋ฐฉ๋ฒ์ ์ฐธ๊ณ ํด aws cli๋ฅผ ๋์ผํ๊ฒ ์ค์น (
sudo apt install awscli
) - ์ด์ s3์ ์ ๊ทผํ๋ ์ฃผ์ฒด์ธ ec2๊ฐ s3์ ์ก์ธ์คํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํด ์ฃผ์ด์ผ ํ๋ค. = aws Role
- aws์๋น์ค ์ค IAM์ ์ ํ - ์ญํ (role) - ์ญํ ๋ง๋ค๊ธฐ.
- ๋ง๋ ์ญํ ์
AmazonS3FulAccess
๋ผ๋ ์ ์ฑ ์ฐ๊ฒฐ - ์ญํ ์์ฑ ํ, ๋ค์ ec2 ์ธ์คํด์ค๋ก ๋์๊ธฐ
- ์ธ์คํด์ค์ ์ฒดํฌ๋ฐ์ค ์ฒดํฌ ํ [์์ ] - [๋ณด์] - [IAM ์ญํ ์์ ] - 'IAM์ญํ '์์ ๋ฐฉ๊ธ ์์ฑํ ์ญํ ์ ํ ํ ์ ์ฅ
- ์ด์ ํด๋น ์ธ์คํด์ค๋ S3์ ์ ๊ทผํ ์ ์๊ฒ ๋จ.
- ํด๋น ์ธ์คํด์ค์์
aws s3 ls
๋ฅผ ์ ๋ ฅํด ์ ์กฐํ๋๋์ง ํ์ธ.
- ec2 ์ธ์คํด์ค์ ์ ์ ํ, 3.์ ๋ฐฉ๋ฒ์ ์ฐธ๊ณ ํด aws cli๋ฅผ ๋์ผํ๊ฒ ์ค์น (
(๋ก์ปฌ) ์ฌ๋ web hook ์ค์ ํ๊ธฐ
- ๋ฐฐํฌ ์๋ํ๋ฅผ ํตํด ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง ๋, ์ฌ๋ ํน์ ์ฑ๋์ ๋ด์ ํตํด ์๋ฆผ์ด ์ ์ก๋๋๋ก ํ ์ ์๋ค.
- https://jojoldu.tistory.com/552 ๋ฅผ ์ฐธ๊ณ ํด ์๋ฆผ์ ๋ฐ์ ์ฌ๋ ์ฑ๋์ webhook ์ฑ์ ์ถ๊ฐํ๊ณ ,
WebhookURL์ฃผ์
๋ฅผ ๋ฐ์ ๋๋ค.
(ec2) ๋ฐฐํฌ ์๋ํ - ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์์ฑ
ec2 ์ธ์คํด์ค์ ์ ์ํด
build.sh
๋ผ๋ ์ด๋ฆ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ๋ค(vi build.sh
). ๊ทธ๋ฆฌ๊ณ ์๋ ๋ด์ฉ์ ์ ๋ ฅํ๋ค.build.sh
#!/bin/bash IP=`curl -s 169.254.169.254/latest/meta-data/public-ipv4` START="$IP start deploying app!" END="$IP end deploying app!" #real deploy script CK=`aws s3 cp jarํ์ผ๋ช s3://๋ฒํท์ด๋ฆ/ํ์ผ์ด๋ฆ` if [[ ! $CK ]]; then echo "no need to build" exit 0 fi curl -X POST --data-urlencode "payload={\"text\": \"$START\"}" WebhookURL์ฃผ์ /usr/bin/fuser -k 8080/tcp aws s3 cp s3://๋ฒํท์ด๋ฆ/jarํ์ผ๋ช .jar ./jarํ์ผ๋ช .jar nohup java -jar jarํ์ผ๋ช .jar & aws s3 rm s3://๋ฒํท์ด๋ฆ/jarํ์ผ๋ช .jar curl -X POST --data-urlencode "payload={\"text\": \"$END\"}" WebhookURL์ฃผ์ echo "Deploy end: `date`"
#์์ #!/bin/bash IP=`curl -s 169.254.169.254/latest/meta-data/public-ipv4` START="$IP start deploying app!" END="$IP end deploying app!" #real deploy script CK=`aws s3 ls s3://codesquad-issue-tracker-team7/issue-tracker.jar` if [[ ! $CK ]]; then echo "no need to build" exit 0 fi curl -X POST --data-urlencode "payload={\"text\": \"$START\"}" https://hooks.slack.com/services/๋งํฌ๋งํฌ/๋งํฌ๋งํฌ/๋งํฌ๋งํฌ /usr/bin/fuser -k 8080/tcp aws s3 cp s3://codesquad-issue-tracker-team7/issue-tracker.jar ./ nohup java -jar issue-tracker.jar & aws s3 rm s3://codesquad-issue-tracker-team7/issue-tracker.jar curl -X POST --data-urlencode "payload={\"text\": \"$END\"}" https://hooks.slack.com/services/๋งํฌ๋งํฌ/๋งํฌ๋งํฌ/๋งํฌ๋งํฌ echo "Deploy end: `date`"
๋์ :
./build.sh
์คํ ์, s3 ๋ฒํท์ ๋น๋ ํ์ผ(.jar)์ด ์์ผ๋ฉด ๋ฐฐํฌ๋ฅผ ์งํํ๊ณ ๋ฐฐํฌ ์ข ๋ฃ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ฐ๋๋ก s3๋ฒํท์ ๋น๋ ํ์ผ์ด ์์ผ๋ฉด ๋ฐฐํฌ๋ฅผ ํ์ง ์๊ณno need to build
๋ฅผ ์ถ๋ ฅํ๋ค.curl -s 169.254.169.254/latest/meta-data/public-ipv4
- ํ์ฌ ec2์ธ์คํด์ค์ public ipv4 ์ฃผ์๋ฅผ ์์๋ธ๋ค.
WebhookURL์ฃผ์
- 7.์์ ๋ฐ์ ๋ ์ฃผ์๋ฅผ ๋ฃ๋๋ค. ๋ฐฐํฌ ์์/์ข ๋ฃ ์ ํด๋น ์ฑ๋์ ์๋ฆผ์ด ์ ์ก๋จ
/usr/bin/fuser -k 8080/tcp
- ํฌํธ ๋ฒํธ(
8080
)๋ฅผ ์ด์ฉํด ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ด๋ ์ฝ๋. - ์ฌ๋ฐฐํฌ ์ ์ด๋ฏธ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ฌ์ผ ํ๋ฏ๋ก ํ์.
- ํฌํธ ๋ฒํธ(
jarํ์ผ๋ช .jar
- 4.์์ ์ง์ ํ ํ์ผ ์ด๋ฆ์
.jar
ํ์ฅ์๋ฅผ ๋ถ์. ์๋ฅผ ๋ค์ดairbnb.jar
.
- 4.์์ ์ง์ ํ ํ์ผ ์ด๋ฆ์
์ด์ ๋ก์ปฌ์์ ec2 ์ธ์คํด์ค์ jarํ์ผ์ ๋ณด๋ธ ํ, ec2์์
./build.sh
๋ง ์คํํ๋ฉด ๋ฐฐํฌ๊ฐ ์๋์ผ๋ก ๋๋ฉฐ ์ฌ๋ ์๋ฆผ๋ ์จ๋ค.
(๋ก์ปฌ) '๋ก์ปฌ ๋น๋ - jarํ์ผ s3๋ก ๋ณต์ฌ' ๊ณผ์ ์๋ํ
๋ก์ปฌ ํ๋ก์ ํธ ํ์ผ ์์น์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก
build.sh
ํ์ผ์ ๋ง๋ค์ด์, jarํ์ผ ๋น๋ ๋ฐ aws s3์ ๋ณต์ฌํ๋ ๊ณผ์ ์ ์๋ํํ ์ ์๋ค.build.sh
#!/bin/bash ./gradlew build jar aws s3 cp build/libs/๋ก์ปฌjarํ์ผ๋ช .jar s3://๋ฒํท์ด๋ฆ/jarํ์ผ๋ช .jar echo "Done!"
์ดํ ๋ก์ปฌ์์๋
./build.sh
๋ช ๋ น์ด๋ฅผ ํตํด ๋น๋, s3๋ณต์ฌ ๊ณผ์ ์ ์๋ํํ ์ ์๋ค.์ด์ ์ฌ๋ฐฐํฌ๋ฅผ ์ํ ๋, ๋ก์ปฌ์์
./build.sh
ํ ec2์ธ์คํด์ค์์./build.sh
์ ๋ ฅํ๋ฉด ์ฌ๋ฐฐํฌ๊ฐ ๋๋๋ค.
(ec2) crontab์ผ๋ก 1๋ถ๋ง๋ค
build.sh
์คํํ๊ธฐec2 ์ธ์คํด์ค์ ์ ์ ํ
crontab -e
๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.์ดํ ๋งจ ์๋์ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
* * * * * /home/ubuntu/build.sh >> log.txt 2>&1
1๋ถ๋ง๋ค
build.sh
๋ฅผ ์คํํ๊ณ , ๊ทธ ๋ก๊ทธ๋ฅผlog.txt
์ ๋จ๊ธด๋ค.cat log.txt
๋ฅผ ํตํด ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์๋ค.