AWS Step Functions wspiera 200 usług AWS, aby ułatwić przepływ automatyzacji

8 października 2021

30 września AWS ogłosił, że AWS Step Functions rozszerza liczbę obsługiwanych usług AWS z 17 do ponad 200, a AWS API Actions z 46 do ponad 9000 dzięki nowej funkcji AWS SDK Service Integrations.

Gdy deweloperzy budują architektury rozproszone, jednym z używanych przez nich wzorców jest wzorzec instrumentacji oparty na przepływie pracy. Wzorzec ten jest przydatny do automatyzacji przepływu pracy wewnątrz usługi w celu wykonywania transakcji rozproszonych. Przykładem transakcji rozproszonej są wszystkie zadania wymagane do obsługi zamówienia i ciągłego śledzenia statusu transakcji.

Step Functions to wizualna usługa przepływu pracy o niskiej zawartości kodu używana do automatyzacji przepływu pracy, organizowania usług i pomagania w stosowaniu tego wzorca. Deweloperzy używają Step Functions z usługami zarządzanymi, takimi jak usługi Artificial Intelligence services, Amazon Simple Storage Service (Amazon S3) i Amazon DynamoDB.

Przedstawianie funkcji Step Functions AWS SDK Service Integrations

Do tej pory, gdy deweloperzy budowali workflow integrujące się z usługami AWS, musieli wybierać spośród 46 obsługiwanych integracji usług, które zapewniało Step Functions. Jeśli integracja usługi nie była dostępna, musieli ją zakodować w funkcji AWS Lambda. Nie jest to idealne rozwiązanie, ponieważ zwiększa złożoność i koszty aplikacji.

Aktualnie dzięki integracji usług Step Functions AWS SDK, deweloperzy mogą zintegrować swoje maszyny stanowe bezpośrednio z usługą AWS, która obsługuje pakiety AWS SDK.

Możesz tworzyć maszyny stanowe korzystające z AWS SDK Service Integrations z Amazon States Language (ASL), AWS Cloud Development Kit (AWS CDK) lub wizualnie za pomocą AWS Step Function Workflow Studio. Aby rozpocząć, utwórz nowy Task state. Następnie wywołaj usługi AWS SDK bezpośrednio z ASL w polu zasobów stanu zadania. Aby to zrobić, użyj następującej składni.

 

arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]

Oto wersja demonstracyjna informująca jak zacząć.

Demo

W tym demo budujesz aplikację, która po otrzymaniu pliku wideo zapisanego w S3 transkrybuje go i tłumaczy z angielskiego na hiszpański.

Zbudujmy to demo za pomocą funkcji Step Functions. Maszyna stanowa wraz z integracjami usług integruje się bezpośrednio z S3, Amazon Transcribe, i Amazon Translate. Interfejs API do transkrypcji jest asynchroniczny. Aby sprawdzić, czy zadanie transkrypcji zostało zakończone, potrzebna jest pętla odpytywania, która czeka, aż będzie gotowe.

AWS Step Functions Supports

Tworzenie maszyny stanowej

Aby śledzić tę demonstrację, musisz spełnić następujące wymagania wstępne:

  • Bucket S3, w którym umieścisz oryginalny plik, który chcesz przetworzyć
  • Plik wideo lub audio w języku angielskim przechowywany w tym bucket’cie
  • Bucket S3, w którym chcesz, aby odbywało się przetwarzanie

Pokażemy Ci, jak wykonać to demo za pomocą konsoli AWS Management Console. Jeśli chcesz wdrożyć to demo jako infrastrukturę jako kod, wdróż szablon AWS CloudFormation dla tego projektu.

Aby rozpocząć korzystanie z tej wersji demonstracyjnej, utwórz nową maszynę stanową. Wybierz opcję Write your workflow in code, aby skompilować maszynę stanów przy użyciu ASL. Utwórz nazwę maszyny stanów oraz stwórz nową rolę.

AWS create new machine

Rozpoczęcie transkrypcji

Aby rozpocząć pracę nad definicją maszyny stanów, możesz edytować maszynę stanów w opcji Edit.

MyStateMachine

Poniższy fragment kodu ASL to maszyna stanów z dwoma zadaniami, które korzystają z nowej możliwości integracji usługi AWS SDK Service Integrations. Pierwszym zadaniem jest skopiowanie pliku z jednego bucket’u S3 do drugiego, a drugim zadaniem jest rozpoczęcie zadania transkrypcji poprzez bezpośrednie wywołanie Amazon Transcribe.

Aby korzystać z tej nowej możliwości z Step Functions, typem stanu musi być Task. Musisz określić nazwę usługi i akcję API przy użyciu następującej składni: „arn:aws:states:::aws-sdk:serviceName:apiAction.”. Użyj camelCase dla nazw apiAction w polu Resource, np. „copyObject”, a PascalCase dla nazw parametrów w polu Parameters, np. „CopySource”.

Aby uzyskać parametry, znajdź nazwę i wymagane parametry w dokumentacji AWS API dla tej usługi i akcji API.

 

 

 

JSON

{

  "Comment": "A State Machine that process a video file",

  "StartAt": "GetSampleVideo",

  "States": {

    "GetSampleVideo": {

      "Type": "Task",

      "Resource": "arn:aws:states:::aws-sdk:s3:copyObject",

      "Parameters": {

        "Bucket.$": "$.S3BucketName",

        "Key.$": "$.SampleDataInputKey",

        "CopySource.$": "States.Format('{}/{}',$.SampleDataBucketName,$.SampleDataInputKey)"

      },

      "ResultPath": null,

      "Next": "StartTranscriptionJob"

    },

    "StartTranscriptionJob": {

      "Type": "Task",

      "Resource": "arn:aws:states:::aws-sdk:transcribe:startTranscriptionJob",

      "Parameters": {

        "Media": {

          "MediaFileUri.$": "States.Format('s3://{}/{}',$.S3BucketName,$.SampleDataInputKey)"

        },

        "TranscriptionJobName.$": "$$.Execution.Name",

        "LanguageCode": "en-US",

        "OutputBucketName.$": "$.S3BucketName",

        "OutputKey": "transcribe.json"

      },

      "ResultPath": "$.transcription",

      "End": true

    }

  }

}

W poprzednim fragmencie kodu można zobaczyć interesujący przypadek użycia tzw. funkcji intrinsic functions, które zapewnia ASL. Możesz skonstruować łańcuch używając różnych parametrów. Korzystanie z wewnętrznych funkcji w połączeniu z AWS SDK Service Integrations pozwala manipulować danymi bez konieczności korzystania z funkcji Lambda. Na przykład ta linia:

JSON

"MediaFileUri.$": "States.Format('s3://{}/{}',$.S3BucketName,$.SampleDataInputKey)"

Nadawanie uprawnień do maszyny stanowej

Jeśli teraz rozpoczniesz wykonywanie maszyny stanów, zakończy się to niepowodzeniem. Ta maszyna stanu nie ma uprawnień dostępu do bucket’ów S3 ani korzystania z usługi Amazon Transscribe. Step Functions nie może automatycznie generować zasad uprawnień IAM dla większości AWS SDK Service Integrations, więc musisz dodać je do roli ręcznie.

Dodaj te uprawnienia do roli uprawnień IAM, która została utworzona dla tej maszyny stanów. Szybki link do roli można znaleźć w szczegółach maszyny stanów. Dołącz do roli zasady „AmazonTranscribeFullAccess” i „AmazonS3FullAccess”.

My State Machine

Pierwsze uruchomienie maszyny stanów

Teraz, gdy uprawnienia są już nadane, możesz uruchomić maszynę stanową. Przyjmuje ona jako dane wejściowe nazwę bucket’u S3, do którego przesyłany jest oryginalny film, nazwę pliku i nazwę bucket’u S3, w którym chcesz zapisać ten plik i wykonać całe przetwarzanie.

Aby to zadziałało, ten plik musi być plikiem wideo lub audio i musi być w języku angielskim. Po zakończeniu zadania transkrypcji, zapisuje wynik w bucket’cie określonym w danych wejściowych pod nazwą transscribe.json.

 

JSON

{

  "SampleDataBucketName": "<name of the bucket where the original file is>",

  "SampleDataInputKey": "<name of the original file>",

  "S3BucketName": "<name of the bucket where the processing will happen>"

}

Ponieważ StartTranscriptionJob jest wywołaniem asynchronicznym, nie zobaczysz wyników od razu. Maszyna stanowa tylko wywołuje API, a następnie kończy działanie. Musisz poczekać, aż zadanie transkrypcji będzie gotowe, a następnie zobaczyć wyniki w bucket’cie wyjściowym w pliku transscribe.json.

Dodawanie pętli odpytywania

Ponieważ chcesz przetłumaczyć tekst przy użyciu wyników transkrypcji, maszyna stanu musi poczekać na zakończenie zadania transkrypcji. Do kompilowania API poller’a w maszynie stanów można użyć stanu Task, Wait i Choice.

  • Stan Task otrzymuje status zadania. W twoim przypadku jest to wywołanie usługi Amazon Transcribe i API getTranscriptionJob.
  • Stan Wait czeka 20 sekund, ponieważ długość zadania transkrypcji zależy od rozmiaru pliku wejściowego.
  • Stan Choice przechodzi do odpowiedniego kroku w oparciu o wynik statusu zadania. Jeśli zadanie zostanie zakończone, przechodzi do następnego kroku w maszynie, a jeśli nie, nadal czeka na jego zakończenie.

check lf transcripion done

Stan Wait

Pierwszym ze stanów, które zamierzasz dodać, jest stan Wait. Jest to prosty stan, który czeka 20 sekund.

JSON

"Wait20Seconds": {

        "Type": "Wait",

        "Seconds": 20,

        "Next": "CheckIfTranscriptionDone"

      },

Stan Task

Następnym stanem do dodania jest stan Task, który wywołuje API getTranscriptionJob. Aby wywołać API, musisz przekazać nazwę zadania transkrypcji. Ten stan zwraca stan zadania, który stanowi dane wejściowe stanu Choice.

JSON

"CheckIfTranscriptionDone": {

        "Type": "Task",

        "Resource": "arn:aws:states:::aws-sdk:transcribe:getTranscriptionJob",

        "Parameters": {

          "TranscriptionJobName.$": "$.transcription.TranscriptionJob.TranscriptionJobName"

        },

        "ResultPath": "$.transcription",

        "Next": "IsTranscriptionDone?"

      },

Stan Choice

Stan Choice ma jedną regułę, która sprawdza, czy status zadania transkrypcji jest zakończony. Jeśli ta reguła jest prawdziwa, przechodzi do następnego stanu. Jeśli nie, przechodzi w stan Wait.

JSON

"IsTranscriptionDone?": {

        "Type": "Choice",

        "Choices": [

          {

            "Variable": "$.transcription.TranscriptionJob.TranscriptionJobStatus",

            "StringEquals": "COMPLETED",

            "Next": "GetTranscriptionText"

          }

        ],

        "Default": "Wait20Seconds"

      },

Pobieranie tekstu transkrypcji

W tym kroku wyodrębniasz tylko tekst transkrypcji z pliku wyjściowego zwróconego przez zadanie transkrypcji. Potrzebujesz tylko transkrybowanego tekstu, ponieważ plik wynikowy zawiera wiele metadanych, które sprawiają, że plik jest zbyt długi i zagmatwany do przetłumaczenia.

Jest to krok, który zwykle wykonałbyś przy użyciu funkcji Lambda. Ale możesz to zrobić bezpośrednio z maszyny stanowej za pomocą ASL.

Najpierw musisz utworzyć stan za pomocą AWS SDK Service Integration, który pobiera plik z rezultatami z S3. Następnie użyj innej wewnętrznej funkcji ASL, aby przekonwertować tekst pliku z ciągu typu String na JSON.

W następnym stanie możesz przetworzyć plik jako obiekt JSON. Ten stan jest stanem Pass, który czyści dane wyjściowe z poprzedniego stanu, aby uzyskać tylko transkrybowany tekst.

JSON

"GetTranscriptionText": {

        "Type": "Task",

        "Resource": "arn:aws:states:::aws-sdk:s3:getObject",

        "Parameters": {

          "Bucket.$": "$.S3BucketName",

          "Key": "transcribe.json"

        },

        "ResultSelector": {

          "filecontent.$": "States.StringToJson($.Body)"

        },

        "ResultPath": "$.transcription",

        "Next": "PrepareTranscriptTest"

      },

 

      "PrepareTranscriptTest" : {

        "Type": "Pass",

        "Parameters": {

          "transcript.$": "$.transcription.filecontent.results.transcripts[0].transcript"

        },

        "Next": "TranslateText"

      },

Tłumaczenie tekstu

Po przygotowaniu przepisywanego tekstu możesz go przetłumaczyć. Do tego możesz użyć usługi Amazon Translate API translateText bezpośrednio z maszyny stanowej. Będzie to ostatni stan maszyny stanów i zwróci przetłumaczony tekst jako wynik tego stanu.

JSON

"TranslateText": {

        "Type": "Task",

        "Resource": "arn:aws:states:::aws-sdk:translate:translateText",

        "Parameters": {

          "SourceLanguageCode": "en",

          "TargetLanguageCode": "es",

          "Text.$": "$.transcript"

         },

         "ResultPath": "$.translate",

        "End": true

      }

Dodaj uprawnienia do maszyny stanu, aby wywoływać interfejs API Translate, dołączając zarządzaną politykę „TranslateReadOnly”.

Teraz, gdy to wszystko masz na swoim miejscu, możesz uruchomić swoją maszynę stanów. Kiedy maszyna stanów zakończy działanie, zobaczysz przetłumaczony tekst na wyjściu ostatniego stanu.

Graph Inspector

Warto wiedzieć

Oto kilka rzeczy, które pomogą Ci korzystać z integracji usługi AWS SDK Service Integration:

  • Wywołuj usługi AWS SDK bezpośrednio z ASL w polu resource stanu zadania. Aby to zrobić, użyj następującej składni: arn:aws:states:::aws-sdk:serviceName:apiAction.[serviceIntegrationPattern]
  • Używaj camelCase dla nazw apiAction w polu Resource, np. „copyObject”, a PascalCase dla nazw parametrów w polu Parameters, np. „CopySource”.
  • Step Functions nie może automatycznie generować polityk uprawnień dla większości integracji usług AWS SDK, więc musisz dodać je ręcznie do roli uprawnień maszyny stanów.
  • Skorzystaj z funkcji ASL intrinsic functions, ponieważ umożliwiają one manipulowanie danymi i unikanie używania funkcji Lambda do prostych przekształceń.

Dostępność

Integracja usługi AWS SDK jest ogólnie dostępna w następujących regionach: wschodnie stany USA (Płn. Wirginia), wschodnie stany USA (Ohio), zachodnie stany USA (Oregon), Kanada (środek), Europa (Irlandia), Europa (Mediolan), Afryka (Kapsztad) oraz Azji i Pacyfiku (Tokio). W najbliższym czasie usługa będzie ogólnie dostępna we wszystkich innych regionach komercyjnych, w których Step Functions jest dostępny.

Aby dowiedzieć się więcej o nowej możliwości, przeczytaj dokumentację.

źródło: AWS

Case Studies
Referencje

Z przyjemnością polecamy firmę Hostersi, z którą mieliśmy przyjemność współpracować przy okazji wdrożenia skalowalnej infrastruktury w Amazon Web Services, opartej o technologię Kubernetes i metodykę DevOps.  Hostersi okazali się niezwykle proaktywnym partnerem, który nie tylko wdrażał wskazane rozwiązania, ale proponował optymalne narzędzia i technologie, które sprawiły, że efekt wdrożenia jest dla nas w pełni satysfakcjonujący. Polecamy!

Grzegorz Lentzy
IT Director LINK Mobility
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.