Skip to content

Commit ed577ee

Browse files
authored
Merge pull request #6 from sopt-makers/feat/#5
feat: lambda CI/CD 구축 완료
2 parents 9051caa + b6e1e14 commit ed577ee

File tree

3 files changed

+139
-5
lines changed

3 files changed

+139
-5
lines changed

.github/workflows/cd.yml

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: sentry-notifier-lambda-cd
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
deploy:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- name: Checkout code
13+
uses: actions/checkout@v4
14+
15+
- name: Set up JDK 21
16+
uses: actions/setup-java@v4
17+
with:
18+
java-version: '21'
19+
distribution: 'corretto'
20+
21+
- name: Setup Gradle with caching
22+
uses: gradle/actions/setup-gradle@v3
23+
24+
- name: Create .env file
25+
run: |
26+
mkdir -p src/main/resources
27+
cat << EOF > src/main/resources/.env
28+
SLACK_WEBHOOK_CREW_DEV_BE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_BE }}
29+
SLACK_WEBHOOK_CREW_DEV_FE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_FE }}
30+
SLACK_WEBHOOK_CREW_PROD_BE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_BE }}
31+
SLACK_WEBHOOK_CREW_PROD_FE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_FE }}
32+
EOF
33+
34+
- name: Build shadow JAR (default = shadowJar)
35+
run: ./gradlew build
36+
37+
- name: Configure AWS credentials
38+
uses: aws-actions/configure-aws-credentials@v4
39+
with:
40+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
41+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
42+
aws-region: ap-northeast-2
43+
44+
- name: Deploy to AWS Lambda
45+
run: |
46+
export AWS_PAGER=""
47+
aws lambda update-function-code \
48+
--function-name sentry-notifier \
49+
--zip-file fileb://build/libs/sentry-webhook-shadow.jar
50+
51+
- name: Notify Slack on success
52+
uses: 8398a7/action-slack@v3
53+
if: success()
54+
with:
55+
status: custom
56+
custom_payload: |
57+
{
58+
"attachments": [{
59+
"color": "good",
60+
"title": "✅ Lambda 배포 성공",
61+
"text": "Sentry Notifier Lambda가 성공적으로 배포되었습니다.",
62+
"fields": [
63+
{
64+
"title": "Workflow Link",
65+
"value": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|워크플로우 링크>",
66+
"short": true
67+
}
68+
]
69+
}]
70+
}
71+
env:
72+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CD_WEBHOOK_URL }}
73+
74+
- name: Notify Slack on failure
75+
uses: 8398a7/action-slack@v3
76+
if: failure()
77+
with:
78+
status: custom
79+
custom_payload: |
80+
{
81+
"attachments": [{
82+
"color": "danger",
83+
"title": "❌ Lambda 배포 실패",
84+
"text": "Sentry Notifier Lambda 배포에 실패했습니다.",
85+
"fields": [
86+
{
87+
"title": "Workflow Link",
88+
"value": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|워크플로우 링크>",
89+
"short": true
90+
}
91+
]
92+
}]
93+
}
94+
env:
95+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CD_WEBHOOK_URL }}

.github/workflows/ci.yml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: sentry-notifier-lambda-ci
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
8+
jobs:
9+
build:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
steps:
14+
- uses: actions/checkout@v4
15+
16+
- name: Setup JDK 21
17+
uses: actions/setup-java@v4
18+
with:
19+
java-version: '21'
20+
distribution: 'corretto'
21+
22+
- name: Setup Gradle with caching
23+
uses: gradle/actions/setup-gradle@v3
24+
25+
- name: Create .env file
26+
run: |
27+
mkdir -p src/main/resources
28+
cat << EOF > src/main/resources/.env
29+
SLACK_WEBHOOK_CREW_DEV_BE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_BE }}
30+
SLACK_WEBHOOK_CREW_DEV_FE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_FE }}
31+
SLACK_WEBHOOK_CREW_PROD_BE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_BE }}
32+
SLACK_WEBHOOK_CREW_PROD_FE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_FE }}
33+
EOF
34+
35+
- name: Compile and run test
36+
run: |
37+
./gradlew check

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@
1010
본 프로젝트는 Sentry 이벤트를 Slack으로 전송하는 AWS Lambda 함수를 구현하기 위해 Spring 없이 Java만으로 구현했습니다.
1111
이러한 기술적 결정에는 다음과 같은 이유가 있습니다:
1212

13-
- AWS Lambda 콜드 스타트 최소화: SpringBoot와 같은 무거운 프레임워크는 초기화 시간이 길어 Lambda의 콜드 스타트 지연 문제를 악화시킬 수 있습니다. 그래서 순수 Java로만 구현하여 시작 시간을 단축했습니다.
14-
- 리소스 효율성: 경량화된 애플리케이션으로 Lambda의 메모리 사용량을 최소화하고, 이는 비용 효율성으로 이어집니다.
15-
- 조직 친화적 기술 스택: Kotlin + Ktor와 같은 대안도 고려했지만, BE 챕터원들이 메이커스 프로젝트 개발에 Java를 주로 사용하고 있다는 점을 고려했습니다. 새로운 언어 도입 시 팀 내 지식 공유와 유지보수에 추가적인 부담이 발생할 수 있어 기존 기술 스택인 Java를 선택했습니다.
16-
- 최소 의존성: 필요한 최소한의 라이브러리만 사용하여 배포 패키지 크기를 줄이고 시작 시간을 개선했습니다.
13+
- **AWS Lambda 콜드 스타트 최소화**: SpringBoot와 같은 무거운 프레임워크는 초기화 시간이 길어 Lambda의 콜드 스타트 지연 문제를 악화시킬 수 있습니다. 그래서 순수 Java로만 구현하여 시작 시간을 단축했습니다.
14+
- **리소스 효율성**: 경량화된 애플리케이션으로 Lambda의 메모리 사용량을 최소화하고, 이는 비용 효율성으로 이어집니다.
15+
- **조직 친화적 기술 스택**: Kotlin + Ktor와 같은 대안도 고려했지만, BE 챕터원들이 메이커스 프로젝트 개발에 Java를 주로 사용하고 있다는 점을 고려했습니다. 새로운 언어 도입 시 팀 내 지식 공유와 유지보수에 추가적인 부담이 발생할 수 있어 기존 기술 스택인 Java를 선택했습니다.
16+
- **최소 의존성**: 필요한 최소한의 라이브러리만 사용하여 배포 패키지 크기를 줄이고 시작 시간을 개선했습니다.
1717

1818
## 🏗️ Tech Stack
19-
2019
- **Java 21**
2120
- **Sentry Webhook**
2221
- **AWS Lambda**
2322
- **API Gateway**
2423

24+
## 🏛️ System Architecture
25+
<img src="https://github.com/user-attachments/assets/226e93b0-bd41-4a3d-8493-ffc67d86006f" alt="Sentry-Lambda 아키텍처 이미지">
26+
2527
## 🔧 Key Features
2628
- Sentry Webhook 이벤트 수신
2729
- API Gateway의 Stage 기능(dev/prod)을 활용한 환경별 요청 분리

0 commit comments

Comments
 (0)