diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..4b749ef --- /dev/null +++ b/.github/workflows/cd.yml @@ -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 }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cc91a6b --- /dev/null +++ b/.github/workflows/ci.yml @@ -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 diff --git a/README.md b/README.md index 6bfbec8..1fb253c 100644 --- a/README.md +++ b/README.md @@ -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 +Sentry-Lambda 아키텍처 이미지 + ## 🔧 Key Features - Sentry Webhook 이벤트 수신 - API Gateway의 Stage 기능(dev/prod)을 활용한 환경별 요청 분리