Ostatnio jednym z moich zadań było stworzenie automatycznej synchronizacji prywatnego repozytorium GitHub z buckietem S3, aby później indeksować zawartość przez AWS Bedrock. TLDR: AWS CodeBuild okazał się znacznie prostszym rozwiązaniem niż początkowo rozważana Lambda.
Problem do rozwiązania
Potrzebowałem stworzyć mechanizm, który:
- Będzie codziennie pobierał zawartość prywatnego repozytorium GitHub
- Skopiuje wszystkie pliki do bucketu S3
- Umożliwi później indeksowanie tej zawartości przez AWS Bedrock
- Będzie prosty w utrzymaniu i konfiguracji
Początkowo myślałem o AWS Lambda jako o typowym podejściu do tego typu zadań, ale szybko odkryłem, że ta droga wiąże się z wieloma komplikacjami. Ostatecznie CodeBuild okazał się znacznie lepszym wyborem.
Dlaczego NIE Lambda?
Choć AWS Lambda świetnie sprawdza się w wielu scenariuszach, w tym przypadku napotkałem kilka istotnych problemów:
- Brak narzędzi Git w środowisku Lambda – Lambda nie zawiera domyślnie narzędzi Git, więc musiałbym dodać te zależności poprzez warstwy Lambda (Lambda Layers)
- Problemy z połączeniem SSH – uwierzytelnianie do prywatnego repozytorium wymagałoby konfiguracji kluczy SSH w Lambdzie, co dodaje kolejną warstwę złożoności
- Więcej kodu do napisania i utrzymania – implementacja w Lambdzie wymagałaby napisania znacznie większej ilości kodu do obsługi klonowania repozytorium, zarządzania zależnościami, itd.
- Ograniczenia czasowe – dla większych repozytoriów jest szansa na przekroczenie czasu wykonania Lambdy
Dlaczego CodeBuild był lepszym wyborem?
AWS CodeBuild okazał się znacznie lepszym rozwiązaniem z kilku powodów:
- Gotowe środowisko z niezbędnymi narzędziami – CodeBuild domyślnie zawiera Git, SSH i inne potrzebne narzędzia deweloperskie
- Prosta konfiguracja – wystarczyło zaledwie kilka linijek w pliku buildspec.yml, aby zdefiniować cały proces
- Łatwa integracja z GitHub – CodeBuild oferuje natywną integrację z repozytoriami GitHub
- Wsparcie dla uwierzytelniania SSH – łatwo można skonfigurować dostęp do prywatnych repozytoriów
Implementacja rozwiązania
1. Konfiguracja projektu CodeBuild
Pierwszym krokiem było utworzenie nowego projektu w AWS CodeBuild z następującymi ustawieniami:
- Źródło: Brak (NO_SOURCE) – ponieważ będziemy klonować repozytorium bezpośrednio w buildspec
- Środowisko: Amazon Linux 2
- Service role: Rola z uprawnieniami do zapisu do S3
- Buildspec: Inline buildspec
2. Konfiguracja uwierzytelniania SSH
Aby uzyskać dostęp do prywatnego repozytorium, potrzebowałem skonfigurować uwierzytelnianie SSH:
- Wygenerowałem parę kluczy SSH dedykowaną dla CodeBuild
- Dodałem klucz publiczny do ustawień GitHub
- Zapisałem klucz prywatny jako sekret w AWS Secrets Manager
- Skonfigurowałem CodeBuild, aby używał tego sekretu podczas budowania
3. Przygotowanie buildspec.yml
Oto prosty plik buildspec.yml, który wykonuje całe zadanie w zaledwie kilku krokach:
version: 0.2
phases:
install:
runtime-versions:
python: 3.9
pre_build:
commands:
# Konfiguracja SSH dla GitHub
- mkdir -p ~/.ssh
- echo "$SSH_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan github.com >> ~/.ssh/known_hosts
build:
commands:
# Klonowanie repozytorium
- git clone git@github.com:username/repository.git
# Synchronizacja z S3
- aws s3 sync repository/ s3://my-bucket/repository/ --delete
post_build:
commands:
# Usunięcie klucza SSH
- rm -f ~/.ssh/id_rsa
artifacts:
files:
- appspec.yml
4. Konfiguracja wyzwalacza
Ponieważ synchronizacja miała odbywać się raz dziennie, skonfigurowałem Amazon EventBridge do uruchamiania projektu CodeBuild codziennie, a także dodałem wyzwalacz z Amazon SNS, aby można było ręcznie uruchomić proces w razie potrzeby.
Wnioski
Rozwiązanie z CodeBuild okazało się:
- Znacznie prostsze w implementacji – zamiast pisać dziesiątki linii kodu w Lambdzie, skonfigurowałem wszystko w kilku linijkach buildspec
- Łatwiejsze w debugowaniu – logi CodeBuild są bardziej czytelne i dają lepszy wgląd w proces
- Bardziej niezawodne – nie musiałem martwić się o zarządzanie zależnościami i środowiskiem
- Bardziej elastyczne – w razie potrzeby mogę łatwo rozszerzyć proces o dodatkowe kroki
Choć to był tylko proof of concept, pokazuje on, że czasami warto rozważyć alternatywne usługi AWS, nawet jeśli początkowo wydają się mniej oczywiste dla danego zadania.