
'일상 & 작문 & 독서' 카테고리의 다른 글
| AWS SUMMIT 2025 후기 - LG전자, 생성형 AI 기반 BI 플랫폼으로 스마트인사이트 구현 (0) | 2025.05.28 |
|---|---|
| 인간실격을 읽고 (4) | 2024.11.07 |
| 마라톤 첫 하프 도전기 (0) | 2024.10.29 |
| [개발자 일상] 버킷리스트 (1) | 2024.09.07 |
| [개발자 일상] aws submmit 2024 를 다녀오고 (0) | 2024.05.27 |

| AWS SUMMIT 2025 후기 - LG전자, 생성형 AI 기반 BI 플랫폼으로 스마트인사이트 구현 (0) | 2025.05.28 |
|---|---|
| 인간실격을 읽고 (4) | 2024.11.07 |
| 마라톤 첫 하프 도전기 (0) | 2024.10.29 |
| [개발자 일상] 버킷리스트 (1) | 2024.09.07 |
| [개발자 일상] aws submmit 2024 를 다녀오고 (0) | 2024.05.27 |

요즘 AI 가 발달하면서 생겨난 일명 "바이브 코딩" 이라는 기술로, 아이디어만 있으면, 누구나 개발이 가능한 환경이 갖춰졌다.
나 역시도 마찬가지로 바이브 코딩으로 하고 싶었던 주제로 서비스를 만들어보기도 하고, 툴을 만들면서 내 업무의 생산성을 높이고 있다.
오늘 다룰 Github Action 이라는 주제와 맞지 않는 서문일 수 있지만, 우리가 만든 개발물은 결국 Git 을 통해 형상관리를 해줘야 손이 덜 가게 된다는 것을 느낄 것이다.
Github 는 Git 을 온라인 호스팅으로 서비스하고 있는 솔루션으로 보면 되고, 마이크소프트 산하의 제품이다.
Github 든 GitLab 이던 Repository 를 만들어 코드를 관리하고 있다면, 매번 새로운 Commit, Merge 가 일어날 때마다 서버에 진입하며 코드를 최신화 ($ git pull) 하고 서비스를 재시작 해야 할 것이다.
보통은 이 과정들을 Script 로 만들고, Jenkins , GoCD 와 같은 CI/CD 서비스 를 이용하여 Git 에 커밋이 발생할 때 자동으로 배포하게 만든다.
Github Action 도 비슷한 기능이 있어, 아래 소개한다.
먼저 로컬에서 SSH 키 페어를 생성
ssh-keygen -t ed25519 -C "github-actions"
생성된 공개키(id_ed25519.pub)를 서버의 ~/.ssh/authorized_keys에 추가, 개인키(id_ed25519)는 일단 복사한다.
Repository → Settings → Secrets and variables → Actions에서 다음 정보들을 등록
SSH_PRIVATE_KEY: SSH 개인키 내용 (1번 과정에서 복사한 개인키를 복사해서 붙여넣는다.)SERVER_HOST: 서버 IP 또는 도메인SERVER_USER: SSH 접속 유저명SERVER_PORT: SSH 포트 (기본값 22)
.github/workflows/deploy.yml 파일을 생성합니다:## 더 간단한 방법: marketplace action 사용
SSH 액션을 직접 작성하는 대신, 검증된 marketplace action을 사용할 수도 있습니다:
name: Test Workflow (여기 이름이 워크플로우 목록에 뜸)
on:
# 수동 실행 가능하도록 설정 (테스트용)
workflow_dispatch:
# push할 때도 실행 (원하면 주석 해제)
# push:
# branches:
# - main
jobs: #워크플로우에서 실행할 작업(job)들을 정의합
test-workflow: # 작업(job)의 고유한 이름입니다. 여기서는 '연결 테스트' 역할
runs-on: ubuntu-latest
# 이 작업이 실행될 환경을 지정. 최신 버전의 Ubuntu 가상 머신에서 실행
steps:
- name: Checkout code
uses: actions/checkout@v4 # GitHub 저장소의 코드를 가상 환경으로 가져오는(체크아웃하는) 공식 액션(v4 버전)을 사용
- name: SSH Connection Test
uses: appleboy/ssh-action@v1.0.0 # SSH를 통해 원격 서버에 명령을 실행하는 서드파티 액션(v1.0.0 버전)을 사용
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: 22
script: |
echo "SSH Connection Test Success"
[여기에 자동화 스크립트 실행 명령어를 넣으면 된다.]


이 방법으로 코드가 푸시될 때마다 자동으로 서버에 배포하거나 특정 작업을 실행할 수 있다.
| N8N 을 helm chart 를 이용해 쿠버네티스 에서 배포해보기 (2) | 2025.05.14 |
|---|---|
| N8N 오픈소스 SW의 소개와 설치 (0) | 2025.05.06 |
| 쿠버네티스(kubernetes) - kubectl 명령어 정리/모음 (2) (0) | 2025.04.08 |
| 빅데이터 생성기 - BigdataSimpleGenerator (0) | 2025.04.01 |
| GPT 를 이용해서 동영상 쇼츠 제작해보기 (0) | 2025.03.25 |

MCP 서버를 내가 외부에 제공한다고 했을 때, 여러 방법이 있을 것 같다.
가장 먼저 생각나는 건 서버 코드를 공유하고 stdio 실행 방식으로 제공하는 방식, 그리고 또 다른 방법은 웹서버를 띄워 StreamableHTTP 방식으로 제공하는 것이다.
MCP 서버를 직접 운영하면서 오픈한다는 의미는 인증과 인가를 붙이겠다는 의미일 것 같다.
AWS Lambda 환경에서 MCP 서버를 배포할 경우 아래의 장점이 있다.
- 인프라 관리가 불필요하여, 서버 운영 부담이 없다.
- 사용한 만큼 비용이 지불되기 때문에 비용 효율성이 높다.
- 자동으로 스케일링이 되기 때문에 트래픽에 따라 h/w 자원을 동적으로 변경할 수 있다.
- 보안 및 권한 관리가 쉽고, 도메인 주소관리, SSL 관리 등의 네트워크 리소스 운영 작업이 편하다.
단점도 있다.
- 최대 실행시간과 메모리 제한이 있고, 로깅과 제어가 제한적이다.
이 포스팅의 목적은 비교적 최근에 나온 MCP 서버를 AWS Lambda 환경에서 MCP 배포가 가능할지 확인해보기 위함이다.
그럼 시작해보자.
1. teams webhook 을 이용해 message 를 발송하는 MCP 서버 구축
2. mcp 서버를 컨테이너 이미지로 생성하고, ECR 레포지토리에 업로드
3. aws lambda 를 생성하고 ecr 에 업로드 된 이미지를 이용하여 배포
4. 아래 두 가지 방식으로 MCP Server 테스트를 한다.
a. Lambda 의 FunctionURL 을 이용해 MCP Client 로 연결하여 Teams 채널로 메세지를 전송해본다.
(LLM 모델은 로컬에서 테스트를 위해 Ollama 모델을 활용)
b. cursor 의 MCP tool 로 등록해서 Teams 채널로 메세지를 전송해본다.
from fastmcp import FastMCP
import os
import requests
import json
from typing import Optional, Dict, Any
WEBHOOK_URL = "웹훅 주소"
mcp = FastMCP("MCP-TEST-SERVER")
@mcp.tool()
async def get_my_info() -> str:
""" 안녕하세요. 저는 러닝을 좋아하는 jssvs 입니다."""
return f""
@mcp.tool()
async def get_weather() -> str:
"""현재 날씨를 조회합니다"""
return f"오늘 날씨는 맑습니다."
@mcp.tool()
def send_teams_message(
message: str,
title: str = None,
) -> bool:
"""
Microsoft Teams 채널에 webhook을 통해 메시지를 전송합니다.
Args:
message (str): 전송할 메시지 내용
title (str, optional): 메시지 제목
Returns:
bool: 전송 성공 여부
Example:
send_teams_message(message="안녕하세요!", title="알림")
"""
color = "00FF00"
# MessageCard 형식으로 페이로드 구성
payload = {
"@type": "MessageCard",
"@context": "https://schema.org/extensions",
"summary": title or "알림",
"sections": [{
"activityTitle": title,
"text": message
}]
}
# 색상이 지정된 경우 추가
if color:
payload["themeColor"] = color
# 제목이 없는 경우 섹션에서 제거
if not title:
del payload["sections"][0]["activityTitle"]
try:
response = requests.post(
WEBHOOK_URL,
headers={"Content-Type": "application/json"},
data=json.dumps(payload)
)
# 성공 여부 확인
if response.status_code == 200:
print(f"✓ 메시지 전송 성공")
return True
else:
print(f"✗ 메시지 전송 실패: {response.status_code}")
print(f"응답: {response.text}")
return False
except Exception as e:
print(f"✗ 오류 발생: {str(e)}")
return False
def main():
host = os.environ.get("HOST","0.0.0.0")
port = int(os.environ.get("PORT",8080))
print(f"Starting FastMCP HTTP Server on {host}:{port}")
print("Available tools:")
print("- get_bdp_team_info: Returns BDP team information")
print("- get_weather: Returns weather information")
print(f"Server accessible at: http://{host}:{port}")
mcp.run(transport="http",host=host, port=port, stateless_http=True)
if __name__ == "__main__":
main()
fastmcp>=0.1.0
requests
FROM python:3.12-slim
WORKDIR /app
# ### Environment Variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Install the specified packages
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
# MCP 서버 코드 복사
COPY mcp_server.py .
# 환경 변수 설정
ENV PORT=8080
ENV AWS_LWA_INVOKE_MODE=response_stream
ENV AWS_LWA_READINESS_CHECK_PORT=8080
ENV AWS_LWA_READINESS_CHECK_PATH=/health
# === Lambda Web Adapter ===
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.0 /lambda-adapter /opt/extensions/lambda-adapter
# 서버 시작 명령어
CMD ["python", "mcp_server.py"]
1) Lambda 설정 시 참고
-> 환경변수에 2개의 값 추가 (Dockerfile 에 ENV 에 추가해줬다면 생략해도 된다.)

2) 기본 TImeout 값으로는 MCP tool 호출이 되기 전에 호출이 종료되기 때문에 값을 조정한다.

A) Strands Agent 코드를 작성하여 테스트 발송
from strands import Agent
from strands.models.ollama import OllamaModel
from strands.tools.mcp.mcp_client import MCPClient
from mcp.client.streamable_http import streamablehttp_client
client = MCPClient(
lambda: streamablehttp_client(
# url = "http://127.0.0.1:8080/mcp"
url = "https://LambdaFunctinURL 주소.lambda-url.ap-northeast-2.on.aws/mcp"
)
)
with client:
tools = client.list_tools_sync()
base_model = OllamaModel(
host = "http://localhost:11434",
model_id = "llama3.1:8b",
temperature = 0.1
)
agent = Agent(tools = tools, model = base_model)
# print(agent.tool.get_weather())
result = agent("teams 채널에 아래 메세지를 전송해줘 \n message : Lambda 에서 구축한 MCP 서버 테스트 \n title : MCP 서버 테스트")
print(result)


B) Cursor MCP 툴 연동하여 테스트 발송



[1] Welcome to FastMCP 2.0 - https://gofastmcp.com/getting-started/welcome
[2] GitHub - awslabs/aws-lambda-web-adapter - https://github.com/awslabs/aws-lambda-web-adapter
[3] Deploy MCP Server on AWS Lambda | Step-by-Step Guide - https://www.youtube.com/watch?v=JncV8hXuyRg&t=341s
[4] 컨테이너 이미지로 Python Lambda 함수 배포 - Python용 AWS 기본 이미지 사용 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-image.html#python-image-instructions