SAM-deploy¶
SAM-deploy lar et team kjøre serverless-funksjoner (Lambda og Fargate) i AWS ved siden av Databricks-workspacet, typisk for å hente data som plattformen må hente selv. Dataspeilet slår på SAM-deploy per workspace. Med det følger rettigheter for deploy-rollen til GitHub Actions, en permission boundary med krav til navn, en bøtte for SAM-artefakter og et ECR-register.
Navnekravene og permission boundary-en gjelder alle workspaces med SAM-deploy. Mappestrukturen, secret-flyten og CI/CD-pipelinen beskriver oppsettet i padda-databrikker.
Verktøy¶
Du trenger følgende verktøy installert lokalt:
| Verktøy | Formål | Installer |
|---|---|---|
| SAM CLI | Bygge og teste SAM-templater | brew install aws-sam-cli |
| Docker | Påkrevd for container-baserte funksjoner og sam local invoke |
docker.com |
| AWS CLI | AWS-autentisering (valgfritt for lokal testing) | brew install awscli |
Mappestruktur¶
Hver serverless-funksjon bor i sin egen mappe under sam/ i deploy-repoet (padda-databrikker):
padda-databrikker/
└── sam/
├── my-api-collector/
│ ├── template.yaml
│ └── src/
│ ├── app.py
│ └── requirements.txt
├── my-container-function/
│ ├── template.yaml
│ └── src/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
└── my-fargate-task/
├── template.yaml
└── src/
├── app.py
├── Dockerfile
└── requirements.txt
CI/CD-pipelinen oppdager automatisk alle mapper på dybde 1 under sam/ og deployer hver enkelt uavhengig.
Navnekonvensjoner¶
Alle ressursnavn må starte med workspace-navnet ditt som prefiks. Permission boundary
støtter både - og _ som separator etter workspace-navnet. Erstatt <workspace-name>
med det faktiske workspace-navnet ditt (f.eks. dig-eksempelteam-stage).
| Ressurs | Tillatte prefikser | Eksempel |
|---|---|---|
| Lambda-funksjonsnavn | <workspace-name>_ eller <workspace-name>- |
<workspace-name>_my-api-collector |
| IAM-rollenavn | <workspace-name>-sam- eller <workspace-name>_sam- |
<workspace-name>-sam-my-api-collector-role |
| CloudFormation-stack | <workspace-name>- |
<workspace-name>-my-api-collector |
| ECS-cluster | <workspace-name>- |
<workspace-name>-fargate-cluster |
| CloudWatch-loggruppe | /aws/lambda/<workspace-name>_ eller <workspace-name>- |
/aws/lambda/<workspace-name>_my-func |
Deploy feiler uten riktige prefikser
Permission boundary blokkerer opprettelse av ressurser som ikke matcher disse prefiksmønstrene. Navnene må starte med riktig prefiks.
ECR-repositorier for container-baserte tjenester¶
Workspaces med enable_ecr_namespace i sam_deploy-modulen får ett ECR-repositorium per tjeneste. Repositoriet opprettes automatisk av ECR første gang workflowen pusher et image, via en repository creation template som plattformteamet eier i Terraform. Templaten setter lifecycle-policy (behold siste 10 images), pull-tilgang for Lambda og kostnadstagger.
| Hva | Verdi |
|---|---|
| Repositorienavn | <workspace-name>-sam/<tjeneste> (skråstrek er påkrevd) |
| Image-tag | commit-SHA |
| Eksempel | dig-eksempelteam-stage-sam/min-tjeneste:abc1234 |
Ny tjeneste med Dockerfile trenger ingen endring i padda-iac. Deploy-rollen kan ikke slette repositorier.
Permission boundary¶
Hver IAM-rolle i en SAM-template må inkludere en permission boundary. Boundary-ARN-en sendes automatisk av deploy-workflowen som PermissionsBoundaryArn-parameteren:
Parameters:
PermissionsBoundaryArn:
Type: String
Description: Permission boundary ARN (settes automatisk av deploy-workflowen)
Resources:
MyFunctionRole:
Type: AWS::IAM::Role
Properties:
PermissionsBoundary: !Ref PermissionsBoundaryArn
# ...
Boundary-en begrenser hvilke tilganger rollen kan ha. Den sikrer at workspace-funksjoner ikke kan eskalere privilegier utover det tiltenkte omfanget.
Secrets via SSM Parameter Store¶
Hemmeligheter håndteres gjennom GitHub Environment-secrets og synkroniseres til AWS SSM Parameter Store av deploy-workflowen.
Flyt¶
flowchart LR
GH[GitHub Environment Secret\nSSM_DATABASE_URL] -->|deploy-workflow| SSM[SSM Parameter Store\n/<workspace-name>/database-url]
SSM -->|boto3 ved kjøretid| Lambda
Navnekonvensjon¶
Deploy-workflowen transformerer secret-navn slik:
- Fjern
SSM_-prefikset - Gjør om til små bokstaver
- Erstatt understrek med bindestrek
| GitHub secret-navn | SSM-parameterbane |
|---|---|
SSM_DATABASE_URL |
/<workspace-name>/database-url |
SSM_API_KEY |
/<workspace-name>/api-key |
SSM_MY_SERVICE_TOKEN |
/<workspace-name>/my-service-token |
Legge til en ny secret¶
- Gå til repoets Settings → Environments → stage → Add secret
- Gi den navnet
SSM_<DITT_PARAM_NAVN>(store bokstaver, understrek) - Sett verdien
- Neste deploy synkroniserer den til SSM som
/<workspace-name>/<ditt-param-navn>
Lese secrets ved kjøretid¶
Send SSM-parameterbanen som en miljøvariabel i template.yaml, og hent den med boto3:
import os
import boto3
def get_secret(param_name: str) -> str:
ssm = boto3.client("ssm")
response = ssm.get_parameter(Name=param_name, WithDecryption=True)
return response["Parameter"]["Value"]
# Bruk
db_url = get_secret(os.environ["DB_URL_PARAM"])
Aldri logg hemmeligheter
Bruk alltid WithDecryption=True og logg aldri den returnerte verdien. Logg parameternavnet og lengden hvis du trenger å verifisere at den ble lest riktig.
CI/CD-pipeline¶
Deploy-pipelinen er definert i .github/workflows/deploy.yml i padda-databrikker.
Trigger¶
- Manuelt:
workflow_dispatch - Pull requests til
main-,dev- ellerstage-brancher
Slik fungerer det¶
flowchart TD
A[Generer matrise] -->|oppdager sam/-mapper| B[Deploy hver funksjon]
B --> C[Konfigurer AWS via OIDC]
C --> D[Logg inn til ECR]
D --> E[Synk SSM_-secrets til SSM]
E --> F[sam build]
F --> G{Inneholder 'fargate'?}
G -->|Ja| H[Docker build & push til ECR]
G -->|Nei| I[sam deploy]
H --> I
- Matrisegenerering — oppdager alle
sam/*/-mapper og oppretter en parallell matrise - AWS-autentisering — bruker OIDC (ingen lagret legitimasjon) for å assume workspace deploy-rollen
- ECR-innlogging — autentiserer Docker mot ECR-registeret
- Secret-synk — synkroniserer alle
SSM_-prefiksede GitHub-secrets til SSM Parameter Store - SAM build — bygger hver funksjon (installerer avhengigheter, pakker kode)
- Docker build (bare Fargate) — bygger og pusher Docker-imaget til ECR
- SAM deploy — deployer CloudFormation-stacken med permission boundary
Miljøvariabler¶
Følgende er konfigurert som GitHub Environment-variabler/-secrets for stage-miljøet:
| Variabel | Beskrivelse |
|---|---|
AWS_REGION |
AWS-region (eu-west-1) |
SAM_S3_BUCKET |
S3-bøtte for SAM-artifakter |
CFN_ROLE_ARN |
CloudFormation execution role ARN |
PERMISSIONS_BOUNDARY_ARN |
Permission boundary policy ARN |
DEPLOY_ROLE_ARN |
OIDC deploy role ARN |
WORKSPACE_NAME |
Workspace-navn |
ECR_REPOSITORY |
ECR-repository-navn for container images |
Lokal testing¶
Zip-basert Lambda¶
Container-basert Lambda¶
Fargate¶
Fargate-tasks kan ikke testes med sam local invoke. Test dem direkte med Docker:
cd sam/my-fargate-task/src
docker build -t my-fargate-task .
docker run --env LOG_LEVEL=INFO my-fargate-task
Runtimes og arkitekturer¶
| Mønster | Runtime | Arkitektur |
|---|---|---|
| Lambda — Zip | Python 3.12 | ARM64 (Graviton) |
| Lambda — Container | Python 3.13 (i Dockerfile) | x86_64 (standard for Docker) |
| Fargate | Python 3.13 (i Dockerfile) | x86_64 (standard) |
ARM64 for Lambda
Zip-baserte Lambdaer bruker ARM64 (Graviton2)-prosessorer, som er mer kostnadseffektive enn x86_64. Container-baserte funksjoner bruker arkitekturen til base-imaget sitt.
Relatert innhold¶
Forklaringer:
- Arkitektur — hvorfor plattformen bruker serverless-tjenester for å hente data
- Serverless compute — Lambda og Fargate, og når du velger hva
Guider:
- Hente data via API — sette opp en funksjon som henter data til landing zone
- Håndtere secrets — hemmeligheter for Lambda og Fargate steg for steg
Referanser:
- Navnekonvensjoner — prefikskravene i sammenheng med plattformens øvrige navn
- Roller og rettigheter — identitetene GitHub Actions deployer med
- Landing zone — bøtta funksjonene skriver til