์ง์ง ์ง์ง ๋ด ์์ผ๋ก AWS๋ก ๋ฐฐํฌ๋ฅผ ๋๋์ด ๋์ ํด๋ณด์!
ํญ์ ํ๋ก์ ํธํ ๋๋ ๋ฐฐํฌ ๋ฅ๋ ฅ์๊ฐ ๋ฐ๋ก ์์ด์ ๋ฐฐํฌ๋ฅผ ์ง์ ์ ๊ฒฝ์จ ๋ณธ ์ ์ด ์์๋ค.
์ด๋ฒ์ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ฐฐํฌ๋ฅผ ์ ๋๋ก ํ๋ฒ ์ฐํ๊ฒ ๊ฒฝํํด๋ณด๋ ค๊ณ ํ๋ค~!
์ด์ํ ๊บผ AWS ํ๋ฆฌํฐ์ด ๋ฝ์ ์ ๋๋ก ๋ฝ์๋ณด๊ธฐ ์ํด์ AWS ECS๋ฅผ ์ฌ์ฉํด์ CI/CD๋ฅผ ๊ตฌ์ถํด ๋ณผ ๊ณํ์ด๋ค.
๋งจ ์ฒ์์ ECS ํด๋ฌ์คํฐ์ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํด๋ณด์.
ECS ํด๋ฌ์คํฐ๋ ์ปจํ
์ด๋๋ฅผ ์คํํ ์ ์๋ ์ธํ๋ผ์ ๋
ผ๋ฆฌ์ ๊ทธ๋ฃน์ด๋ค.
์ปจํ
์ด๋ํ ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ด๋ฆฌํ๊ณ ๋ฐฐํฌํ๊ณ ํ์ฅํ๋ ๊ธฐ๋ณธ ๋จ์์ด๋ค.
EC2 ์ธ์คํด์ค๋ ์ปจํ ์ด๋๊ฐ ์คํ๋ ์๋ฒ ํ๊ฒฝ์ด๋ค. Linux ์ปดํจํฐ ํ ๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
โ ECS Cluster ์์ฑ
๐ฑ AWS Console > Amazon Elastic Container Service > Cluster > [Create cluster]
๐ค ์ ์ฌ๊ธฐ์ ์ธํ๋ผ๋ฅผ ์ ํ ์ํ๋์?
์ฌ๊ธฐ์ Infrastructure์ Amazon EC2 instances๋ฅผ ์ ํํ๋ฉด Auto Scaling Group์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑํด์ ์ฐ๋๋ก ๋์ด์๋ค.
EC2 ํ๋๋ง ์ธ๊บผ๋ฉด ๊ตณ์ด Auto Scaling Group์ ์ธ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ฌ๊ธฐ์ ์ฐ๊ฒฐํ๋ ค ํ์ง ๋ง๊ณ , ๋จผ์ ์์ฑํ ๋ค์ EC2 ์ธ์คํด์ค์ ์ฐ๊ฒฐ ์ค์ ์ ํด์ฃผ์!
โก EC2 ์ธ์คํด์ค ์์ฑ
๐ฑ AWS Console > EC2 > Instances > Launch instances
์ฐธ๊ณ ) Installing the Amazon ECS container agent
ECS ํด๋ฌ์คํฐ์ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํด์ฃผ์๋ค๋ฉด ์ด ๋์ ์ฐ๊ฒฐํด์ฃผ์.
๋ค์์ ECS ํด๋ฌ์คํฐ๊ฐ EC2 ์ธ์คํด์ค๋ฅผ ์ธ์ํ๊ธฐ ์ํ ์ค์ ์ด๋ค.
EC2์ ์ ์ํด์ ์งํํด์ฃผ์.
๋๋ SSH ์ธ๋ฐ์ด๋๋ฅผ ์ ์ ์ด์ด๋๊ณ ์ฝ์ ๋ด์์ EC2 Instance Conncet๋ก ์ ์ํ๋ค.
โ ECS agent ์ค์นํ๊ธฐ
curl -O https://s3.ap-northeast-2.amazonaws.com/amazon-ecs-agent-ap-northeast-2/amazon-ecs-init-latest.x86_64.rpm
sudo yum localinstall -y amazon-ecs-init-latest.x86_64.rpm
โก ์ค์ ํ์ผ ์์ ํ๊ธฐ
/lib/systemd/system/ecs.service
์ [Unit]
๋ถ๋ถ์ ๋ง์ง๋ง ์ค ๋ค์๊ณผ ๊ฐ์ด ์์ After=cloud-final.service
/etc/ecs/ecs.config
ํ์ผ ์์ฑ```bash
ECS_CLUSTER=์์ฑํ ํด๋ฌ์คํฐ ์ด๋ฆ์ ์ฌ๊ธฐ์
```
โข ECS agent ์คํํ๊ธฐ
sudo systemctl start ecs # ์ง๊ธ ์์
sudo systemctl enable ecs # EC2 ์ธ์คํด์ค๊ฐ ์ฌ์์ ๋๋ฉด ์๋ ์์
โฃ ECS Cluster์์ ์ฐ๊ฒฐ ํ์ธํ๊ธฐ
๐ฑ AWS Console > Amazon Elastic Container Service > Clusters > ์์ฑํ cluster ์ ํ
ํ๋จ ํญ Infrasture > Container instances์ ์์์ ์ค์ ํ EC2 ์ธ์คํด์ค๊ฐ ์ฐ๊ฒฐ๋์๋์ง ํ์ธํ๋ค.
์์ ๊ฐ์ด ๋ณด์ธ๋ค๋ฉด ์ฑ๊ณต ๐
์ด์ , ECS๊ฐ ์ ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ํด์ ๊ฐ๋จํ ์ค์ตํด๋ณด์.
์ฌ๊ธฐ์ ECR๋ฅผ ์ฌ์ฉํด๋ณผ ๊ฑด๋ฐ, ECR์ AWS์์ docker image๋ฅผ ๊ด๋ฆฌํ๋ ์ผ์ข ์ docker hub๋ค.
โ Private registry ์์ฑํ๊ธฐ
๐ฑ AWS Console > Amazon Elastic Container Registry > Private Repositories > [Create repository]
โก EC2์์ ECR ์ธ์ฆ์ ์ํด IAM ์ฌ์ฉ์ ์์ฑํ๊ธฐ
๐ฑ AWS Console > Identity and Access Management (IAM) ****> Access management > Users > [Create user]
โข IAM ์ฌ์ฉ์์ Access key ์์ฑํ๊ธฐ
๐ฑ AWS Console > Identity and Access Management (IAM) ****> Access management> Users
์์ฑํ IAM User ์ ํ > [create access key]
โ ์์ฑ๋ Access key์ Secret access key๋ฅผ ๊ธฐ๋กํด๋๋ค. (์ถํ์ ๋ค์ ๋ณผ ์ ์์!)
โฃ EC2 ์ธ์คํด์ค์์ ECR ๋ก๊ทธ์ธ
๐ฑ EC2 ์ธ์คํด์ค์ ์ ์ํด์ ์งํ
~/.aws/credentials
ํ์ผ ์์ฑ[default]
awa_access_key_id = ์๊น ์์ฑ๋ Access key
aws_secret_access_key = ์๊น ์์ฑ๋ Secret access key
# docker install
sudo yum install -y docker
# docker ์คํ
sudo systemctl start docker
# ec2 ์ธ์คํด์ค ์ฌ์์ํ๋ฉด docker ์๋ ์คํ
sudo systemctl enable docker
ECR ๋ก๊ทธ์ธ
์๊น ์คํํ Repository์์ [View push commands]๋ฅผ ํด๋ฆญํ์ ๋ ๋จ๋ 1๋ฒ command๋ฅผ ๊ทธ๋๋ก ์ ๋ ฅ
aws ecr get-login-password --region <๋ฆฌ์ > | docker login --username AWS --password-stdin <์ด์นด์ดํธ_์์ด๋>.dkr.ecr.<๋ฆฌ์ >.amazonaws.com
โค ํ ์คํธ๋ฅผ ์ํ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
๐ฑ EC2 ์ธ์คํด์ค์ ์ ์ํด์ ์งํ
<!doctype html>
<h1>hello ecs!</h1>
FROM nginx:latest
COPY ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
โฅ docker image ๋น๋ํ๊ณ ๋ฐฐํฌํด๋ณด๊ธฐ
docker build -t test-image:latest .
docker run -d -p 80:80 --name test-container test-image:latest
์ดํ EC2 ์ธ์คํด์ค์ Public IPv4 address๋ฅผ ํ์ธ
http://<public ip>
์ ์ํด๋ณด๊ธฐโ ๋ง์ฝ์ ์ ์์ด ์๋๋ฉด?
๐ฑ EC2 ์ธ์คํด์ค ์์ธ > Security ํญ > Security groups ์ ํ
- Inbound rules์ HTTP ์ถ๊ฐํ๊ธฐ!
โฆ ECR์ docker image ํธ์ํ๊ธฐ
export $REGISTRY=<์ด์นด์ดํธ_์์ด๋>.dkr.ecr.<๋ฆฌ์ >.amazonaws.com
export $REPOSITORY_NAME=<์์ฑํ ๋ ํฌ์งํฐ๋ฆฌ ์ด๋ฆ>
docker tag test-image:latest $REGISTRY/$REPOSITORY_NAME:test
docker push $REGISTRY/$REPOSITORY_NAME:test
์์ฑํ ๋ ํฌ์งํฐ๋ฆฌ์ ์ด๋ฏธ์ง๊ฐ ์ถ๊ฐ๋์๋์ง ํ์ธํ๊ธฐ
โ Task์์ ์ฌ์ฉํ IAM role ์์ฑํ๊ธฐ
๐ฑ AWS Console > Identity and Access Management (IAM) ****> Access management > Roles > [Create role]
โก Task ์์ฑํ๊ธฐ
๐ฑ AWS Console > Amazon Elastic Container Service > Task definitions > [Create new task definition]
$REGISTRY/$REPOSITORY_NAME:test
CMD-SHELL,curl -f http://localhost || exit 1
โข Task ์คํํ๊ธฐ
๐ฑ ์์ฑํ Task ์์ธ > Deploy > Run task
์ดํ, http://<public ip>
์ ์ํด๋ณด๊ธฐ
์ฌ๊ธฐ์ ๋ฐฐํฌํ ํ์ด์ง๊ฐ ๋ณด์ด๋ฉด ์ฑ๊ณต ๐
์ฌ์ค ECS ์ฒ์ ์๋ํ์ ๋๋ ๋๋ฌด ํค๋งธ๋ค.
์ฌ๊ธฐ์ ๊ธฐ ๋ธ๋ก๊ทธ, gpt... ๋ฅผ ๋ฐ๋ผํ๋ฉด์ ๋ญ์ง๋ ๋ชจ๋ฅด๋ ๊ธฐ๋ฅ๋ค, ํ์ํ์ง๋ ์์ ์ค์ ๋ค์ ์น์ด๋๊ฐ๋ค๋ณด๋ ๊ผฌ์ฌ์ ๋ ์ด์ ์งํํ ์๊ฐ ์์๋ค.
๊ทธ๋์ ๋ชจ๋ ๊ฑธ ๋ด๋ ค๋๊ณ ๋ค์ ์๋ํ๋ค. (์ ๋ง ๋ด๋ ค๋์... ๊ณ์ ์ง์ฐ๊ณ ์๋ก ๋ง๋ค์๋ค)
๋ด๊ฐ ์ดํด๋ ๋ฒ์ ๋ด์์ ๊ผญ ํ์ํ ๊ธฐ๋ฅ๋ง ์น์ด๊ฐ๋ฉฐ ์งํํ๋ ์ ์ ํ๋ฆฌ๊ธฐ ์์ํ๋ค. ๊ทธ์ ์ผ ๋ด๊ฐ ๋ณ๋ก ์ค์ํ์ง๋ ์์ ์ค์ ๋ค๋ก ํค๋งค์ ์ค์ํ ์ค์ ์ ํ์ง ์์๋ค๋ ๊ฑธ ์์๋ค.
์ด๋ ต๊ณ ์๋ก์ด ๊ฒ์ ์๋ํ ๋๋ ์ต๋ํ ์ฌํํ๊ณ ์๊ฒ ์๋ํด๋ณด๋ ๊ฒ์ด ๋ฒ ์คํธ์ธ ๊ฒ ๊ฐ๋ค. ํ์ฅ์ ๊ทธ ๋ค์์ ํด๋ ์ถฉ๋ถํ๋๊น ๐