Rozpoczynamy tworzenie zasobów CICD, które zbudują nam zasoby pod aplikację. Zaczynam od instrukcji create-cicd-resources.pdf
- Repozytorium z kodem infrastruktury pod aplikację
- Repozytorium z kodem zasobów CICD
- Parametry SSM z ID kont AWS, na których znajdują się poszczególne środowiska
- Klucz KMS do szyfrowania artefaktów
- Zestaw ról do wdrażania infrastruktury pod aplikację
- Parametry SSM z nazwami ról
- Dokument SSM z kodem tworzenia użytkownika w bazie danych
- Pozostałe zasoby CICD – Bucket S3 na artefakty – Role dla AWS CodeBuild i AWS CodePipeline
- Projekty AWS CodeBuild: – Testowanie szablonów i zbudowanie artefaktów – Utworzenie użytkownika w bazie danych – Przesłanie plików do bucketów S3 – Specyfikacje buildspec.yaml dla każdego z projektów – Skrypty bashowe
- Pipeliny AWS CodePipeline – Pipeline do tworzenia zasobów Dodatkowo:
- Skrypt klonujący parametry środowiska (pod dodatkowe środowisko developerskie)
- Pipeline usuwający część zasobów
- AWS EventBridge rule + rola - do automatycznego uruchamiania pipeline po aktualizacji kodu na określonym branchu w określonym repozytorium kodu infrastruktury
- AWS EventBridge rule + rola - do uruchamiania pipelinów o określonej porze
- (3 ✏️) deploy-account-params.sh
- () deploy-cicd-events.sh
- (8) deploy-cicd-resources.sh
- (6 ✏️) deploy-cicd-roles-parameters.sh
- (5 ✏️) deploy-cicd-roles.sh
- (9) deploy-create-db-user-project.sh
- (12) deploy-delete-resources-pipeline.sh
- (4) deploy-kms.sh
- (10 ✏️) deploy-pipeline.sh
- (7) deploy-ssm-command-create-db-user.sh
- (9) deploy-test-config-project.sh
- (9) deploy-upload-files-project.sh
Poniżej uwagi do powyższej checklisty, które nie są aż tak istotne jeśli podobnie do mnie budujesz zasoby 3 czy 4 raz :)
Rozwiń: Uwagi do budowania pipeline CICD
Opis w oddzielnej instrukcji: create-code-repositories.pdf
Utworzyłem repozytoria na CodeCommit (odpalając skrypty z katalogu repositories), sklonowałem je (do odrębnych katalogów) poza kursowym repozytorium.
Następnie:
- rozpakowałem kod infrastruktury memes-generator-infra.zip do katalogu z repozytorium memes-generator-shared-cicd-infra. Pliki wkomitowałem do gałęzi development.
- rozpakowałem kod CI/CD memes-generator-cicd.zip do katalogu z repozytorium memes-generator-shared-cicd-cicd. Pliki wkomitowałem do gałęzi feature/cicd-resources-for-infra.
Cześć parametrów w szablonie jest wykomentowana - pozostawiam jak jest. Plik parametrów należy uzupełnić o nr konta.
Szablon odwołuje się do nieistniejących parametrów (wykomentowanych w [3](#/3. Parametry kont)) Wykomentowuje je również tutaj.
Przed uruchomieniem uzupełniam parametry Arn klucza i nr konta w pliku cicd-roles-dev.json
aws cloudformation describe-stacks --stack-name memes-generator-cicd-kms-shared-dev --region eu-west-1
aws sts get-caller-identity
W pliku parametrów cicd-roles-parameters-shared-dev.json
podaje nazwy ról z outputu poprzedniego stack-a
aws cloudformation describe-stacks --region eu-west-1 --stack-name memes-generator-cicd-cicd-roles-dev
Odpalam skrypt. Update plików nie jest wymagany.
Odpalam skrypt. Update plików nie jest wymagany.
Odpalam skrypty. Update plików nie jest wymagany.
Poprawiam nazwę akcji dla stage CreateDBUser - do szblonu wkradł się błąd Kopiego Pasta ;)
Weryfikuję, jakie parametry zostaną użyte podczas uruchomienia skryptu. Mam czyste konto - uruchamiam target stage dev
.
Odpalam skrypt. Update plików nie jest wymagany.
Utworzenie stack-a (a więc zasobu CodePipeline) od razu uruchamia ten pipeline. Dlatego warto spojrzeć jaki TargetStage
infrastruktury aplikacji
zostanie utworzony. Jeśli mamy pozostałości zasobów z poprzednich tygodni warto jest utworzyć nowy stage by nie kolidował.
Klonowanie środowiska jest opisane w instrukcji.
Uruchomienie (ponownie) pipeline po utworzeniu
aws codepipeline start-pipeline-execution --name <NAZWA PIPELINE>
Jeśli potrzeba wykonujemy z repozytorium infra gdzie sklonowane parametry trzeba wypchnąć. Całość opisana w klonowanie środowiska.
Odpalam skrypty. Nieprawidłowa wartość dla parametru RepositoryName
- kopiuje z pipeline-a tworzącego zasoby.
Usuwane zasoby
- Autoscalling
- Nat Gateway-e (A & B)
- Load Balancer
Do pipeline-a tworzącego zasoby pod aplikację dodałem nowy stage DeployWebsiteResources
a w nim akcje
- stworzenie i uruchomienie changeset-u dla bucketu na statyczne pliki strony
- stworzenie i uruchomienie changeset-u dla dystrybucji CloudFront i bucket policy umożliwiającej dostęp do plików strony przez CF
Do plików z zasobami CICD (aby było prościej, normalnie stworzyłbym osobny projekt) dodaję
Wiaderek tworzyliśmy już tyle...
# some parts ommited
phases:
install:
runtime-versions:
nodejs: 12.x
commands:
- npm install
build:
commands:
- npm run build
...
# some parts ommited
Okazuję się że wystarczy jeden projekt CodeBuild aby:
- pobrać źródła strony z brancha
develpment
repozytorium, - wywołać instalacje zależności i budowanie statycznych zasobów (patrz buildspec),
- umieścić pliki z folderu
build
w bucket-cie na pliki statyczne