Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: sentry-notifier-lambda-cd

on:
push:
branches:
- main

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'corretto'

- name: Setup Gradle with caching
uses: gradle/actions/setup-gradle@v3

- name: Create .env file
run: |
mkdir -p src/main/resources
cat << EOF > src/main/resources/.env
SLACK_WEBHOOK_CREW_DEV_BE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_BE }}
SLACK_WEBHOOK_CREW_DEV_FE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_FE }}
SLACK_WEBHOOK_CREW_PROD_BE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_BE }}
SLACK_WEBHOOK_CREW_PROD_FE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_FE }}
EOF

- name: Build shadow JAR (default = shadowJar)
run: ./gradlew build

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2

- name: Deploy to AWS Lambda
run: |
export AWS_PAGER=""
aws lambda update-function-code \
--function-name sentry-notifier \
--zip-file fileb://build/libs/sentry-webhook-shadow.jar

- name: Notify Slack on success
uses: 8398a7/action-slack@v3
if: success()
with:
status: custom
custom_payload: |
{
"attachments": [{
"color": "good",
"title": "✅ Lambda 배포 성공",
"text": "Sentry Notifier Lambda가 성공적으로 배포되었습니다.",
"fields": [
{
"title": "Workflow Link",
"value": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|워크플로우 링크>",
"short": true
}
]
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CD_WEBHOOK_URL }}

- name: Notify Slack on failure
uses: 8398a7/action-slack@v3
if: failure()
with:
status: custom
custom_payload: |
{
"attachments": [{
"color": "danger",
"title": "❌ Lambda 배포 실패",
"text": "Sentry Notifier Lambda 배포에 실패했습니다.",
"fields": [
{
"title": "Workflow Link",
"value": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|워크플로우 링크>",
"short": true
}
]
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CD_WEBHOOK_URL }}
37 changes: 37 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: sentry-notifier-lambda-ci

on:
pull_request:
branches:
- main

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4

- name: Setup JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'corretto'

- name: Setup Gradle with caching
uses: gradle/actions/setup-gradle@v3

- name: Create .env file
run: |
mkdir -p src/main/resources
cat << EOF > src/main/resources/.env
SLACK_WEBHOOK_CREW_DEV_BE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_BE }}
SLACK_WEBHOOK_CREW_DEV_FE=${{ secrets.SLACK_WEBHOOK_CREW_DEV_FE }}
SLACK_WEBHOOK_CREW_PROD_BE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_BE }}
SLACK_WEBHOOK_CREW_PROD_FE=${{ secrets.SLACK_WEBHOOK_CREW_PROD_FE }}
EOF

- name: Compile and run test
run: |
./gradlew check
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,20 @@
본 프로젝트는 Sentry 이벤트를 Slack으로 전송하는 AWS Lambda 함수를 구현하기 위해 Spring 없이 Java만으로 구현했습니다.
이러한 기술적 결정에는 다음과 같은 이유가 있습니다:

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

## 🏗️ Tech Stack

- **Java 21**
- **Sentry Webhook**
- **AWS Lambda**
- **API Gateway**

## 🏛️ System Architecture
<img src="https://github.com/user-attachments/assets/226e93b0-bd41-4a3d-8493-ffc67d86006f" alt="Sentry-Lambda 아키텍처 이미지">

## 🔧 Key Features
- Sentry Webhook 이벤트 수신
- API Gateway의 Stage 기능(dev/prod)을 활용한 환경별 요청 분리
Expand Down
Loading