Amazon Lightsail 생성
1. Amazon Lightsail 로 이동 후 create instance 클릭
2. Linux/Unix 선택, Operationing System (OS) only 선택, Amazon Linux 2023 선택
3. Dual-stack 선택, 90일 무료 $12 사이즈 선택
4. Lightsail instance 이름 입력, Create instance 클릭
5. Amazon_Linux_2023-1 이라는 인스턴스 생성됨
IAM 정책, 사용자 생성
1. IAM 으로 이동
2. 사용자로 이동
3. 사용자 생성 클릭
4. 사용자 이름 입력 후 다음 클릭
5. 직접 정책 연결 선택
6. AWSCodeDeployFullAccess 검색 & 선택 다음 클릭
7. 사용자 생성 클릭
8. 생성한 test-user 클릭
9. 권한 추가 클릭, 인라인 정책 생성 클릭
10. lightsail 검색 후 선택
11. 읽기 선택, GetInstancePortStates를 선택
12. 쓰기 선택, CloseInstancePublicPorts, OpenInstancePublicPorts를 선택
13. 리소스는 모두를 선택, 다음을 클릭
14. 정책 이름 입력 후 다음 클릭
액세스 키 생성
1. 사용자에서 생성한 유저 클릭
2. 보안 자격 증명 선택 후 액세스 키 만들기 클릭
3. 기타 선택 후 다음 클릭
4. 태그 값 입력 후 액세스 키 만들기 클릭
5. 액세스 키 다운로드 후 완료 클릭
workflow
YML 작성
1. 프로젝트의 root에서 .github / workflows / deploy.yml 을 생성
name: CI
on:
push:
branches: [main]
workflow_dispatch:
# 환경변수
env:
# aws region
AWS_REGION: ap-northeast-2
# 인스턴스 이름
INSTANCE_NAME: Amazon_Linux_2023-1
jobs:
build:
# ubuntu-latest 환경에서 실행
runs-on: ubuntu-latest
# 작업 순서
steps:
# 레포지토리 체크아웃
- name: checkout release
uses: actions/checkout@v3
# AWS 인증
- name: AWS 인증하기
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
# AWS Lightsail에 연결되었는지 확인
- name: AWS Lightsail에 연결되었는지 확인
run: aws configure list
# 공인 IP 가져오기
- name: Get Public IP
id: ip
uses: haythem/public-ip@v1.3
# 공인 IP 출력
- name: Print Public IP
run: |
echo "Current public IP: ${{ steps.ip.outputs.ipv4 }}"
# Lightsail에 공인 IP 추가
- name: Add public IP to Lightsail
run: |
NEW_IP="${{ steps.ip.outputs.ipv4 }}/32"
echo "Adding public IP: $NEW_IP"
aws lightsail open-instance-public-ports \
--instance-name ${{ env.INSTANCE_NAME }} \
--region ${{ env.AWS_REGION }} \
--port-info protocol=tcp,fromPort=22,toPort=22,cidrs="[$NEW_IP]"
# SSH로 서버에 접속하여 배포 스크립트 실행
- name: Run Deployment Script
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
port: 22
password: ${{ secrets.SERVER_PASSWORD }}
script: |
mkdir -p /home/ec2-user/hello
# 현재 CIDR 가져오고 사용하지 않는 CIDR 제거
- name: Get current CIDRs for port 22 and remove them
id: get_cidrs
run: |
EXISTING_RULES=$(aws lightsail get-instance-port-states \
--instance-name ${{ env.INSTANCE_NAME }} \
--region ${{ env.AWS_REGION }} | jq -r '.portStates[] | select(.protocol=="tcp" and .fromPort==22) | .cidrs[]')
# 중복 및 잘못된 형식 처리
CLEANED_RULES=$(echo "$EXISTING_RULES" | sort -u | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(/[0-9]+)?$')
echo "CLEANED_RULES=$CLEANED_RULES"
# 각 CIDR 처리
echo "$CLEANED_RULES" | while read RULE; do
if [ -n "$RULE" ] && [ "$RULE" != "123.123.123.123/32" ]; then
echo "Removing $RULE from allowed CIDRs..."
aws lightsail close-instance-public-ports \
--instance-name ${{ env.INSTANCE_NAME }} \
--region ${{ env.AWS_REGION }} \
--port-info protocol=tcp,fromPort=22,toPort=22,cidrs=${RULE}
else
echo "Skipping $RULE..."
fi
done
secret 설정
1. github에서 settings > Secrets and variables > Actions를 클릭
2. New repository secret을 선택해서 변수를 추가
테스트