Synchronizacja repozytorium GitHub z S3 przy użyciu AWS CodeBuild – prosty sposób na wdrożenie bez zbędnego kodu

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:

  1. 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)
  2. Problemy z połączeniem SSH – uwierzytelnianie do prywatnego repozytorium wymagałoby konfiguracji kluczy SSH w Lambdzie, co dodaje kolejną warstwę złożoności
  3. 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.
  4. 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:

  1. Gotowe środowisko z niezbędnymi narzędziami – CodeBuild domyślnie zawiera Git, SSH i inne potrzebne narzędzia deweloperskie
  2. Prosta konfiguracja – wystarczyło zaledwie kilka linijek w pliku buildspec.yml, aby zdefiniować cały proces
  3. Łatwa integracja z GitHub – CodeBuild oferuje natywną integrację z repozytoriami GitHub
  4. 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:

  1. Wygenerowałem parę kluczy SSH dedykowaną dla CodeBuild
  2. Dodałem klucz publiczny do ustawień GitHub
  3. Zapisałem klucz prywatny jako sekret w AWS Secrets Manager
  4. 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ę:

  1. Znacznie prostsze w implementacji – zamiast pisać dziesiątki linii kodu w Lambdzie, skonfigurowałem wszystko w kilku linijkach buildspec
  2. Łatwiejsze w debugowaniu – logi CodeBuild są bardziej czytelne i dają lepszy wgląd w proces
  3. Bardziej niezawodne – nie musiałem martwić się o zarządzanie zależnościami i środowiskiem
  4. 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.

Scroll to Top