# AWS - Step Functions Enum

{{#include ../../../banners/hacktricks-training.md}}

## Step Functions

AWS Step Functions je servis za radne tokove koji vam omogućava da koordinirate i orkestrirate više AWS servisa u serverless radne tokove. Korišćenjem AWS Step Functions, možete dizajnirati i pokretati radne tokove koji povezuju različite AWS servise kao što su AWS Lambda, Amazon S3, Amazon DynamoDB i mnoge druge, u nizu koraka. Ova orkestracija pruža vizuelni interfejs za radne tokove i nudi **state machine** mogućnosti, omogućavajući vam da definišete svaki korak radnog toka na deklarativan način koristeći JSON-bazirani **Amazon States Language** (ASL).

## Ključni koncepti

### Standardni vs. Express Radni Tokovi

AWS Step Functions nudi dva tipa **state machine workflows**: Standardni i Express.

- **Standardni Radni Tok**: Ova podrazumevana vrsta radnog toka je dizajnirana za dugotrajne, izdržljive i auditable procese. Podržava **tačno-jednom izvršenje**, osiguravajući da se zadaci izvršavaju samo jednom osim ako nisu navedeni ponovni pokušaji. Idealna je za radne tokove koji zahtevaju detaljnu istoriju izvršenja i može trajati do jedne godine.
- **Express Radni Tok**: Ova vrsta je idealna za zadatke visokog obima i kratkog trajanja, koji traju do pet minuta. Podržavaju **barem-jednom izvršenje**, pogodno za idempotentne zadatke kao što je obrada podataka. Ovi radni tokovi su optimizovani za troškove i performanse, naplaćujući na osnovu izvršenja, trajanja i korišćenja memorije.

### Stanja

Stanja su osnovne jedinice state mašina. Definišu pojedinačne korake unutar radnog toka, mogući su da izvršavaju razne funkcije u zavisnosti od tipa:

- **Zadatak:** Izvršava posao, često koristeći AWS servis kao što je Lambda.
- **Izbor:** Donosi odluke na osnovu ulaza.
- **Neuspeh/Uspjeh:** Završava izvršenje neuspehom ili uspehom.
- **Prolaz:** Prolazi ulaz u izlaz ili ubacuje podatke.
- **Čekanje:** Odlaže izvršenje na određeno vreme.
- **Paralelno:** Pokreće paralelne grane.
- **Mapiranje:** Dinamički iterira korake preko stavki.

### Zadatak

**Zadatak** stanje predstavlja jednu jedinicu posla koju izvršava state mašina. Zadatci mogu pozivati različite resurse, uključujući aktivnosti, Lambda funkcije, AWS servise ili API-je trećih strana.

- **Aktivnosti**: Prilagođeni radnici koje upravljate, pogodni za dugotrajne procese.
- Resurs: **`arn:aws:states:region:account:activity:name`**.
- **Lambda Funkcije**: Izvršava AWS Lambda funkcije.
- Resurs: **`arn:aws:lambda:region:account:function:function-name`**.
- **AWS Servisi**: Integrira se direktno sa drugim AWS servisima, kao što su DynamoDB ili S3.
- Resurs: **`arn:partition:states:region:account:servicename:APIname`**.
- **HTTP Zadatak**: Poziva API-je trećih strana.
- Polje resursa: **`arn:aws:states:::http:invoke`**. Zatim, trebate pružiti detalje konfiguracije API krajnje tačke, kao što su API URL, metoda i detalji autentifikacije.

Sledeći primer prikazuje definiciju Zadatka koja poziva Lambda funkciju pod nazivom HelloWorld:
```json
"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
}
```
### Choice

A **Choice** state dodaje uslovnu logiku u radni tok, omogućavajući odluke na osnovu ulaznih podataka. Evaluira navedene uslove i prelazi u odgovarajuću državu na osnovu rezultata.

- **Comparison**: Svako pravilo izbora uključuje operator poređenja (npr., **`NumericEquals`**, **`StringEquals`**) koji upoređuje ulaznu promenljivu sa određenom vrednošću ili drugom promenljivom.
- **Next Field**: Choice states ne podržavaju **`End`** polje, umesto toga definišu **`Next`** stanje u koje će preći ako je poređenje tačno.

Primer **Choice** state:
```json
{
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
}
```
### Fail/Succeed

A **`Fail`** stanje zaustavlja izvršenje mašine stanja i označava je kao neuspeh. Koristi se za specificiranje imena greške i uzroka, pružajući detalje o neuspehu. Ovo stanje je terminalno, što znači da završava tok izvršenja.

A **`Succeed`** stanje uspešno zaustavlja izvršenje. Obično se koristi za završavanje radnog toka kada se uspešno završi. Ovo stanje ne zahteva **`Next`** polje.

{{#tabs }}
{{#tab name="Fail example" }}
```json
"FailState": {
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
}
```
{{#endtab }}

{{#tab name="Primer uspeha" }}
```json
"SuccessState": {
"Type": "Succeed"
}
```
{{#endtab }}
{{#endtabs }}

### Pass

**Pass** stanje prosleđuje svoj ulaz na svoj izlaz ili bez obavljanja bilo kakvog posla ili transformišući JSON ulaz stanja koristeći filtre, a zatim prosleđuje transformisane podatke sledećem stanju. Korisno je za testiranje i konstruisanje stanja mašina, omogućavajući vam da ubacite statičke podatke ili ih transformišete.
```json
"PassState": {
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
}
```
### Wait

**Wait** stanje odlaže izvršenje mašine stanja na određeni vremenski period. Postoje tri osnovne metode za podešavanje vremena čekanja:

- **X Sekundi**: Fiksan broj sekundi za čekanje.

```json
"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
```

- **Apsolutni vremenski pečat**: Tačno vreme do kada treba čekati.

```json
"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
```

- **Dinamičko čekanje**: Na osnovu ulaza koristeći **`SecondsPath`** ili **`TimestampPath`**.

```json
jsonCopiar código
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}
```

### Parallel

**Parallel** stanje omogućava vam da izvršavate više grana zadataka istovremeno unutar vašeg radnog toka. Svaka grana se izvršava nezavisno i obrađuje svoju vlastitu sekvencu stanja. Izvršenje čeka dok sve grane ne završe pre nego što pređe na sledeće stanje. Njegova ključna polja su:

- **Branches**: Niz koji definiše paralelne putanje izvršenja. Svaka grana je posebna mašina stanja.
- **ResultPath**: Definiše gde (u ulazu) da se postavi kombinovani izlaz grana.
- **Retry and Catch**: Konfiguracije za obradu grešaka za paralelno stanje.
```json
"ParallelState": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
}
```
### Map

**Map** stanje omogućava izvršavanje skupa koraka za svaki element u skupu podataka. Koristi se za paralelno procesiranje podataka. U zavisnosti od toga kako želite da obradite stavke skupa podataka, Step Functions pruža sledeće režime:

- **Inline Mode**: Izvršava podskup stanja za svaki JSON niz stavki. Pogodno za male zadatke sa manje od 40 paralelnih iteracija, izvršavajući svaku od njih u kontekstu radnog toka koji sadrži **`Map`** stanje.

```json
"MapState": {
"Type": "Map",
"ItemsPath": "$.arrayItems",
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "AddState",
"States": {
"AddState": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:add-function"
},
"End": true
}
}
},
"End": true
"ResultPath": "$.detail.added",
"ItemsPath": "$.added"
}
```

- **Distributed Mode**: Dizajniran za paralelno procesiranje velikih razmera sa visokom konkurencijom. Podržava obradu velikih skupova podataka, kao što su oni pohranjeni u Amazon S3, omogućavajući visoku konkurenciju do 10,000 paralelnih izvršavanja radnog toka, izvršavajući ove decu kao odvojeno izvršavanje.

```json
"DistributedMapState": {
"Type": "Map",
"ItemReader": {
"Resource": "arn:aws:states:::s3:getObject",
"Parameters": {
"Bucket": "my-bucket",
"Key": "data.csv"
}
},
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "DISTRIBUTED",
"ExecutionType": "EXPRESS"
},
"StartAt": "ProcessItem",
"States": {
"ProcessItem": {
"Type": "Task",
"Resource": "arn:aws:lambda:region:account-id:function:my-function",
"End": true
}
}
},
"End": true
"ResultWriter": {
"Resource": "arn:aws:states:::s3:putObject",
"Parameters": {
"Bucket": "myOutputBucket",
"Prefix": "csvProcessJobs"
}
}
}
```

### Versions and aliases

Step Functions takođe omogućava upravljanje implementacijama radnog toka kroz **versions** i **aliases** mašine stanja. Verzija predstavlja snimak mašine stanja koji može biti izvršen. Alias služi kao pokazivač na do dve verzije mašine stanja.

- **Versions**: Ovi nepromenljivi snimci mašine stanja kreiraju se iz najnovije revizije te mašine stanja. Svaka verzija se identifikuje jedinstvenim ARN-om koji kombinuje ARN mašine stanja sa brojem verzije, odvojenim dvotačkom (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number`**). Verzije se ne mogu uređivati, ali možete ažurirati mašinu stanja i objaviti novu verziju, ili koristiti željenu verziju mašine stanja.
- **Aliases**: Ovi pokazivači mogu referencirati do dve verzije iste mašine stanja. Više aliasa može biti kreirano za jednu mašinu stanja, svaki identifikovan jedinstvenim ARN-om konstruisanim kombinovanjem ARN mašine stanja sa imenom aliasa, odvojenim dvotačkom (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName`**). Aliasi omogućavaju usmeravanje saobraćaja između jedne od dve verzije mašine stanja. Alternativno, alias može ukazivati na jednu specifičnu verziju mašine stanja, ali ne na druge alias-e. Mogu se ažurirati da preusmere na drugu verziju mašine stanja po potrebi, olakšavajući kontrolisane implementacije i upravljanje radnim tokom.

Za detaljnije informacije o **ASL**, proverite: [**Amazon States Language**](https://states-language.net/spec.html).

## IAM Roles for State machines

AWS Step Functions koristi AWS Identity and Access Management (IAM) uloge za kontrolu pristupa resursima i akcijama unutar mašine stanja. Evo ključnih aspekata vezanih za bezbednost i IAM uloge u AWS Step Functions:

- **Execution Role**: Svaka mašina stanja u AWS Step Functions je povezana sa IAM ulogom za izvršenje. Ova uloga definiše koje akcije mašina stanja može izvesti u vaše ime. Kada mašina stanja prelazi između stanja koja komuniciraju sa AWS uslugama (kao što je pozivanje Lambda funkcija, pristupanje DynamoDB, itd.), preuzima ovu ulogu za izvršenje da bi izvršila te akcije.
- **Permissions**: IAM uloga za izvršenje mora biti konfigurisana sa dozvolama koje omogućavaju neophodne akcije na drugim AWS uslugama. Na primer, ako vaša mašina stanja treba da pozove AWS Lambda funkcije, IAM uloga mora imati **`lambda:InvokeFunction`** dozvole. Slično, ako treba da piše u DynamoDB, odgovarajuće dozvole (**`dynamodb:PutItem`**, **`dynamodb:UpdateItem`**, itd.) moraju biti dodeljene.

## Enumeration

ReadOnlyAccess politika je dovoljna za sve sledeće akcije enumeracije.
```bash
# State machines #

## List state machines
aws stepfunctions list-state-machines
## Retrieve informatio about the specified state machine
aws stepfunctions describe-state-machine --state-machine-arn <value>

## List versions for the specified state machine
aws stepfunctions list-state-machine-versions --state-machine-arn <value>
## List aliases for the specified state machine
aws stepfunctions list-state-machine-aliases --state-machine-arn <value>
## Retrieve information about the specified state machine alias
aws stepfunctions describe-state-machine-alias --state-machine-alias-arn <value>

## List executions of a state machine
aws stepfunctions list-executions --state-machine-arn <value> [--status-filter <RUNNING | SUCCEEDED | FAILED | TIMED_OUT | ABORTED | PENDING_REDRIVE>] [--redrive-filter <REDRIVEN | NOT_REDRIVEN>]
## Retrieve information and relevant metadata about a state machine execution (output included)
aws stepfunctions describe-execution --execution-arn <value>
## Retrieve information about the state machine associated to the specified execution
aws stepfunctions describe-state-machine-for-execution --execution-arn <value>
## Retrieve the history of the specified execution as a list of events
aws stepfunctions get-execution-history --execution-arn <value> [--reverse-order | --no-reverse-order] [--include-execution-data | --no-include-execution-data]

## List tags for the specified step Functions resource
aws stepfunctions list-tags-for-resource --resource-arn <value>

## Validate the definition of a state machine without creating the resource
aws stepfunctions validate-state-machine-definition --definition <value> [--type <STANDARD | EXPRESS>]

# Activities #

## List existing activities
aws stepfunctions list-activities
## Retrieve information about the specified activity
aws stepfunctions describe-activity --activity-arn <value>

# Map Runs #

## List map runs of an execution
aws stepfunctions list-map-runs --execution-arn <value>
## Provide information about the configuration, progress and results of a Map Run
aws stepfunctions describe-map-run --map-run-arn <value>
## Lists executions of a Map Run
aws stepfunctions list-executions --map-run-arn <value> [--status-filter <RUNNING | SUCCEEDED | FAILED | TIMED_OUT | ABORTED | PENDING_REDRIVE>] [--redrive-filter <REDRIVEN | NOT_REDRIVEN>]
```
## Privesc

Na sledećoj stranici možete proveriti kako da **zloupotrebite Step Functions dozvole za eskalaciju privilegija**:

{{#ref}}
../aws-privilege-escalation/aws-stepfunctions-privesc.md
{{#endref}}

## Post Exploitation

{{#ref}}
../aws-post-exploitation/aws-stepfunctions-post-exploitation.md
{{#endref}}

## Persistence

{{#ref}}
../aws-persistence/aws-step-functions-persistence.md
{{#endref}}

## References

- [https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsstepfunctions.html](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsstepfunctions.html)
- [https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)
- [https://states-language.net/spec.html](https://states-language.net/spec.html)

{{#include ../../../banners/hacktricks-training.md}}
