# Dla systemów Linux/macOS
brew install opentofu
# Alternatywnie, pobierz z oficjalnej strony:
# https://opentofu.org/docs/intro/install/
Zainstaluj AWS CLI, aby móc zarządzać zasobami AWS z poziomu terminala.
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
Upewnij się, że masz zainstalowanego Gita:
git --version
git clone https://github.com/deployed/flashcards-workshop-ops.git
aws configure
Podaj wymagane informacje:
- AWS Access Key ID: [Twój klucz dostępu]
- AWS Secret Access Key: [Twój sekretny klucz]
- Default region name: eu-west-1
- Default output format: json
# Sprawdź, czy możesz połączyć się z kontem AWS
aws sts get-caller-identity
Powinieneś zobaczyć swoją tożsamość AWS, co potwierdza poprawną konfigurację.
W katalogu projektu uruchom:
tofu init
Tofu zainstaluje wszystkie wymagane zasoby i przygotuje środowisko do pracy.
Otwórz plik required_variables.tf
i uzupełnij wymagane zmienne:
# Przykład uzupełnienia zmiennych
variable "group_name" {
description = "Unikalna nazwa grupy używana jako prefiks zasobów"
type = string
default = "twoja-nazwa-grupy"
}
Zmienne vpc_id
oraz vpc_subnet_id
już posiadają wartości default. Nie zmieniaj ich, będą potrzebne do konfiguracji interfejsu sieciowego EC2.
Po uzupełnieniu zmiennych, uruchom:
tofu plan
Jeśli wszystko zostało poprawnie skonfigurowane, plan powinien zostać wygenerowany bez błędów.
Zaloguj się do konsoli AWS.
W tym ćwiczeniu utworzysz maszynę wirtualną EC2 oraz przypiszesz jej interfejs sieciowy i konfigurację firewalla pozwalającą na połączenie z zewnątrz.
Zanim stworzysz EC2 potrzebujesz pary kluczy by móc się na nią zalogować. Dodaj klucz publiczny do zmiennej vm_public_key
.
Tworzenie EC2 jest trochę jak budowa nowego komputera - musisz zebrać elementy które tworzą maszynę wirtualną a potem podać je jako argumenty do zasobu aws_instance
.
Na potrzeby testowe możesz stworzyć też EC2 bez podawania tych dodatkowych wartości, jednak zostaną wtedy zaaplikowane ustawienia domyślne które nie są szczególnie użyteczne. Aby wyczyścić po testowym deploymencie użyj polecenia tofu destroy
Potrzebne będą:
- Definicja pary kluczy SSH (w tofu podajesz tylko klucz publiczny) - instrukcja do wygenerowania kluczy od githuba https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
- Definicja security group wraz z zasadami ingress oraz egress
- Definicja interfejsu sieciowego do którego podłączysz security grupę
- Publiczny adres ip (elastic) skojarzony z maszyną wirtualną
Dodatkowe informacje:
- Skorzystaj z ami:
ami-0fbb72557598f5284
- Podsieć w której stworzysz maszynę to:
10.42.0.0/24
- Stwórz instancję typu
t2.micro
Po stworzeniu vmki
- Spróbuj połączyć się po ssh (default user to admin)
- zainstaluj nginx wykonując polecenia
sudo apt update
,sudo apt install nginx
- wykonaj polecenie
sudo systemctl status nginx
- strona powinna widnieć pod adresem EC2 na porcie 80
Pełną dokumentację providera AWS dla OpenTofu znajdziesz tutaj.
W tym ćwiczeniu utworzysz funkcję Lambda, która czyta z pliku tesktowego przechowywanego w S3 i udostępnia je poprzez HTTP.
Zacznij od zdefiniowania bucketu S3, który będzie przechowywał plik tekstowy:
Użyj do tego resource'a aws_s3_bucket
.
Jako prefix nazwy bucketu użyj zmiennej group_name
.
Jak sprawdzić? Po wykonaniu terraform apply
sprawdź, czy bucket został utworzony:
- Zaloguj się do konsoli AWS
- Przejdź do usługi S3 (wpisz "S3" w wyszukiwarce)
- Na liście bucketów znajdź bucket z prefixem odpowiadającym twojej zmiennej
group_name
Załaduj plik tekstowy do bucketu. Plik znajduje się w katalogu lambda_resources
:
resource "aws_s3_object" "random_lines_file" {
bucket = [...]
key = [...]
source = [...]
etag = filemd5("${path.module}/lambda_resources/random_lines.txt")
}
Jak sprawdzić? Po wykonaniu terraform apply
sprawdź zawartość bucketu:
- W konsoli AWS przejdź do sekcji S3
- Kliknij na nazwę utworzonego bucketu
- Powinieneś zobaczyć plik
random_lines.txt
na liście obiektów
Lambda potrzebuje przypisaje roli z odpowiednimi uprawnieniami:
resource "aws_iam_role" "lambda_role" {
name = "${var.group_name}_lambda_s3_role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "lambda.amazonaws.com"
}
}]
})
}
Ten krok deifiniuje rolę IAM, która pozwala, do której w następnych krokach przypiszemy polityki dostępu do S3.
Jak sprawdzić? Po wykonaniu terraform apply
sprawdź, czy rola została utworzona:
- W konsoli AWS przejdź do usługi IAM (wpisz "IAM" w wyszukiwarce)
- W menu po lewej stronie wybierz "Roles"
- W polu wyszukiwania wpisz nazwę roli z prefixem
group_name
- Rola powinna być widoczna na liście
Teraz musisz utworzyć politykę, która pozwoli funkcji Lambda na odczyt plików z S3:
- Skorzystaj z resource'a
aws_iam_policy
- Potrzebujemy uprawnień
s3:GetObject
orazs3:ListBucket
resource "aws_iam_policy" "lambda_s3_policy" {
name = "${var.group_name}_lambda_s3_access_policy"
description = "Allow Lambda to access S3"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = [...]
Action = [...]
Resource = [
aws_s3_bucket.random_lines_bucket.arn,
"${aws_s3_bucket.random_lines_bucket.arn}/*"
]
}]
})
}
Jak sprawdzić? Po wykonaniu terraform apply
:
- W konsoli AWS przejdź do IAM
- W menu po lewej wybierz "Policies"
- Wyszukaj politykę z prefixem twojej zmiennej
group_name
- Kliknij na nią, aby zobaczyć szczegóły uprawnień
Połącz utworzoną rolę z polityką:
resource "aws_iam_role_policy_attachment" "lambda_s3" {
role = <nazwa_roli>
policy_arn = <arn_polityki>
}
Jak sprawdzić? Po wykonaniu terraform apply
:
- W konsoli AWS przejdź do IAM
- Wybierz "Roles" z menu po lewej
- Znajdź i kliknij na rolę z prefixem
group_name
- W zakładce "Permissions" powinna być widoczna dołączona polityka również z prefixem
group_name
Utwórz archiwum ZIP zawierające kod funkcji Lambda:
- Skorzystaj z resource'a
archive_file
- Wykorzystaj plik
random_line_function.py
z katalogulambda_resources
- Wygenerowane archiwum ZIP powinno być zapisane w tym samym katalogu
data "archive_file" "lambda_zip" {
type = "zip"
source_file = [...]
output_path = [...]
}
Jak sprawdzić? Po wykonaniu terraform apply
:
- Sprawdź lokalnie, czy plik ZIP został utworzony w katalogu
lambda_resources
- Możesz otworzyć plik ZIP, aby upewnić się, że zawiera plik
.py
Teraz zdefiniuj samą funkcję Lambda:
- Skorzystaj z resource'a
aws_lambda_function
- Użyj roli IAM, którą stworzyłeś wcześniej
- Użyj archiwum ZIP, które stworzyłeś w poprzednim kroku
- Ustaw zmienne środowiskowe
BUCKET_NAME
iFILE_KEY
na odpowiednie wartości:BUCKET_NAME
powinien być równy nazwie bucketu S3FILE_KEY
powinien być równy kluczowi pliku w bucketcie S3
resource "aws_lambda_function" "random_line_lambda" {
function_name = "${var.group_name}-random-line-function"
handler = "random_line_function.lambda_handler"
role = <arn_roli>
runtime = "python3.10"
filename = [...]
source_code_hash = [...]
environment {
variables = {
BUCKET_NAME = [...]
FILE_KEY = [...]
}
}
}
Jak sprawdzić? Po wykonaniu terraform apply
:
- W konsoli AWS przejdź do usługi Lambda (wpisz "Lambda" w wyszukiwarce)
- Na liście funkcji znajdź funkcję z prefixem twojej zmiennej
group_name
- Kliknij na funkcję, aby zobaczyć jej szczegóły
- W zakładce "Configuration" -> "Environment variables" sprawdź, czy zmienne BUCKET_NAME i FILE_KEY zostały poprawnie ustawione
Aby umożliwić dostęp do funkcji Lambda przez URL:
- Skorzystaj z resource'a
aws_lambda_function_url
- Użyj funkcji Lambda, którą stworzyłeś w poprzednim kroku
- Authorization type ustaw na
NONE
, tak aby każdy mógł wywołać funkcję przez URL
resource "aws_lambda_function_url" "random_line_lambda_url" {
function_name = [...]
authorization_type = "NONE"
}
Jak sprawdzić? Po wykonaniu terraform apply
:
- W konsoli AWS przejdź do usługi Lambda
- Kliknij na funkcję z prefixem twojej zmiennej
group_name
- W zakładce "Function overview" powinna być widoczna sekcja "Function URL"
Lambda wymaga odpowiednich uprawnień, aby można było ją wywoływać przez URL:
- Skorzystaj z resource'a
aws_lambda_permission
- Użyj funkcji Lambda, którą stworzyłeś w poprzednim kroku\
- Ustaw
authorization_type
naNONE
, aby umożliwić publiczny dostęp do funkcji
resource "aws_lambda_permission" "function_url" {
statement_id = "${var.group_name}_AllowPublicAccess"
action = "lambda:InvokeFunctionUrl"
function_name = [...]
principal = "*"
function_url_auth_type = [...]
}
Jak sprawdzić? Uprawnienia są niewidoczne bezpośrednio w konsoli, ale można sprawdzić działanie URL:
- W konsoli AWS przejdź do Lambda
- Kliknij na funkcję z prefixem twojej zmiennej
group_name
- Skopiuj URL funkcji z zakładki "Function URL"
- Otwórz URL w przeglądarce - jeśli otrzymasz odpowiedź (a nie błąd autoryzacji), oznacza to, że uprawnienia zostały poprawnie skonfigurowane
Na koniec dodaj output, który wyświetli URL funkcji Lambda po zaaplikowaniu konfiguracji:
output "lambda_function_url" {
value = [...]
}
Jak sprawdzić? Po wykonaniu terraform apply
:
- W terminalu po zakończeniu działania
terraform apply
sprawdź, czy w outputach jest widoczny URL funkcji Lambda - Możesz również sprawdzić output za pomocą polecenia
terraform output lambda_function_url
Po wdrożeniu infrastruktury, możesz przetestować funkcję Lambda:
- Uruchom
terraform apply
aby wdrożyć infrastrukturę - Sprawdź URL funkcji Lambda:
terraform output lambda_function_url
- Użyj przeglądarki lub curl do wywołania funkcji:
curl $(terraform output -raw lambda_function_url)
- Aby uzyskać konkretną linię, dodaj parametr
line_number
:curl "$(terraform output -raw lambda_function_url)?line_number=3"