Penggunaan AWS CDK untuk membuat alur kerja Express di Step Functions - AWS Step Functions

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Penggunaan AWS CDK untuk membuat alur kerja Express di Step Functions

Dalam tutorial ini, Anda belajar cara membuat API Gateway REST API dengan mesin keadaan ekspres sinkron sebagai integrasi backend, menggunakan AWS Cloud Development Kit (AWS CDK) Infrastruktur sebagai kerangka kode (IAC).

Anda akan menggunakan StepFunctionsRestApi konstruksi untuk menghubungkan State Machine ke API Gateway. StepFunctionsRestApiKonstruksi akan menyiapkan pemetaan input/output default dan API Gateway RESTAPI, dengan izin yang diperlukan dan metode “”. HTTP ANY

Dengan AWS CDK adalah kerangka Infrastruktur sebagai Kode (IAC), Anda mendefinisikan AWS Infrastruktur menggunakan bahasa pemrograman. Anda menentukan aplikasi dalam salah satu bahasa yang CDK didukung, mensintesis kode menjadi AWS CloudFormation template, dan kemudian menyebarkan infrastruktur ke Anda AWS akun.

Anda akan menggunakan AWS CloudFormation untuk mendefinisikan API Gateway RESTAPI, yang terintegrasi dengan Synchronous Express State Machine sebagai backend, lalu gunakan AWS Management Console untuk memulai eksekusi.

Sebelum memulai tutorial ini, siapkan AWS CDK lingkungan pengembangan seperti yang dijelaskan dalam Memulai Dengan AWS CDK - Prasyarat, lalu instal AWS CDK dengan menerbitkan:

npm install -g aws-cdk

Langkah 1: Siapkan Anda AWS CDK Proyek

Pertama, buat direktori untuk yang baru AWS CDK aplikasi dan inisialisasi proyek.

TypeScript
mkdir stepfunctions-rest-api cd stepfunctions-rest-api cdk init --language typescript
JavaScript
mkdir stepfunctions-rest-api cd stepfunctions-rest-api cdk init --language javascript
Python
mkdir stepfunctions-rest-api cd stepfunctions-rest-api cdk init --language python

Setelah proyek diinisialisasi, aktifkan lingkungan virtual proyek dan instal AWS CDK dependensi dasar.

source .venv/bin/activate python -m pip install -r requirements.txt
Java
mkdir stepfunctions-rest-api cd stepfunctions-rest-api cdk init --language java
C#
mkdir stepfunctions-rest-api cd stepfunctions-rest-api cdk init --language csharp
Go
mkdir stepfunctions-rest-api cd stepfunctions-rest-api cdk init --language go
catatan

Pastikan untuk memberi nama stepfunctions-rest-api direktori. Bagian AWS CDK Template aplikasi menggunakan nama direktori untuk menghasilkan nama untuk file sumber dan kelas. Jika Anda menggunakan nama yang berbeda, aplikasi Anda tidak akan cocok dengan tutorial ini.

Sekarang instal modul pustaka konstruksi untuk AWS Step Functions dan Amazon API Gateway.

TypeScript
npm install @aws-cdk/aws-stepfunctions @aws-cdk/aws-apigateway
JavaScript
npm install @aws-cdk/aws-stepfunctions @aws-cdk/aws-apigateway
Python
python -m pip install aws-cdk.aws-stepfunctions python -m pip install aws-cdk.aws-apigateway
Java

Edit pom.xml proyek untuk menambahkan dependensi berikut di dalam kontainer <dependencies> yang sudah ada.

<dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>stepfunctions</artifactId> <version>${cdk.version}</version> </dependency> <dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>apigateway</artifactId> <version>${cdk.version}</version> </dependency>

Maven menginstal dependensi ini secara otomatis saat Anda membangun aplikasi berikutnya. Untuk membangun, mengeluarkan, mvn compile atau menggunakan perintah Build IDE Java Anda.

C#
dotnet add src/StepfunctionsRestApi package Amazon.CDK.AWS.Stepfunctions dotnet add src/StepfunctionsRestApi package Amazon.CDK.AWS.APIGateway

Anda juga dapat menginstal paket yang ditunjukkan menggunakan Visual Studio NuGetGUI, tersedia melalui Tools > NuGet Package Manager > Manage NuGet Packages for Solution.

Setelah Anda menginstal modul, Anda dapat menggunakannya di AWS CDK aplikasi dengan mengimpor paket-paket berikut.

TypeScript
@aws-cdk/aws-stepfunctions @aws-cdk/aws-apigateway
JavaScript
@aws-cdk/aws-stepfunctions @aws-cdk/aws-apigateway
Python
aws_cdk.aws_stepfunctions aws_cdk.aws_apigateway
Java
software.amazon.awscdk.services.apigateway.StepFunctionsRestApi software.amazon.awscdk.services.stepfunctions.Pass software.amazon.awscdk.services.stepfunctions.StateMachine software.amazon.awscdk.services.stepfunctions.StateMachineType
C#
Amazon.CDK.AWS.StepFunctions Amazon.CDK.AWS.APIGateway
Go

Tambahkan yang berikut ini ke import dalamstepfunctions-rest-api.go.

"github.com/aws/aws-cdk-go/awscdk/awsapigateway" "github.com/aws/aws-cdk-go/awscdk/awsstepfunctions"

Langkah 2: Gunakan AWS CDK untuk membuat API Gateway REST API dengan integrasi backend Synchronous Express State Machine

Pertama, kami akan menyajikan potongan kode individual yang mendefinisikan Synchronous Express State Machine dan API Gateway RESTAPI, lalu menjelaskan cara menyatukannya ke dalam AWS CDK aplikasi. Kemudian Anda akan melihat cara mensintesis dan men-deploy sumber daya ini.

catatan

Mesin Negara yang akan kami tunjukkan di sini akan menjadi Mesin Negara sederhana dengan Pass status.

Untuk membuat Express State Machine

Ini adalah AWS CDK kode yang mendefinisikan mesin negara sederhana dengan Pass status.

TypeScript
const machineDefinition = new stepfunctions.Pass(this, 'PassState', { result: {value:"Hello!"}, }) const stateMachine = new stepfunctions.StateMachine(this, 'MyStateMachine', { definition: machineDefinition, stateMachineType: stepfunctions.StateMachineType.EXPRESS, });
JavaScript
const machineDefinition = new sfn.Pass(this, 'PassState', { result: {value:"Hello!"}, }) const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: machineDefinition, stateMachineType: stepfunctions.StateMachineType.EXPRESS, });
Python
machine_definition = sfn.Pass(self,"PassState", result = sfn.Result("Hello")) state_machine = sfn.StateMachine(self, 'MyStateMachine', definition = machine_definition, state_machine_type = sfn.StateMachineType.EXPRESS)
Java
Pass machineDefinition = Pass.Builder.create(this, "PassState") .result(Result.fromString("Hello")) .build(); StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine") .definition(machineDefinition) .stateMachineType(StateMachineType.EXPRESS) .build();
C#
var machineDefinition = new Pass(this, "PassState", new PassProps { Result = Result.FromString("Hello") }); var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { Definition = machineDefinition, StateMachineType = StateMachineType.EXPRESS });
Go
var machineDefinition = awsstepfunctions.NewPass(stack, jsii.String("PassState"), &awsstepfunctions.PassProps { Result: awsstepfunctions.NewResult(jsii.String("Hello")), }) var stateMachine = awsstepfunctions.NewStateMachine(stack, jsii.String("StateMachine"), &awsstepfunctions.StateMachineProps { Definition: machineDefinition, StateMachineType: awsstepfunctions.StateMachineType_EXPRESS, })

Anda dapat melihat dalam cuplikan singkat ini:

  • Definisi mesin bernamaPassState, yang merupakan Pass Negara.

  • Nama logis Mesin Negara,MyStateMachine.

  • Definisi mesin digunakan sebagai definisi State Machine.

  • Jenis Mesin Negara diatur sebagai EXPRESS karena hanya StepFunctionsRestApi akan mengizinkan mesin status Synchronous Express.

Untuk membuat API Gateway REST API menggunakan StepFunctionsRestApi konstruksi

Kami akan menggunakan StepFunctionsRestApi konstruksi untuk membuat API Gateway REST API dengan izin yang diperlukan dan pemetaan input/output default.

TypeScript
const api = new apigateway.StepFunctionsRestApi(this, 'StepFunctionsRestApi', { stateMachine: stateMachine });
JavaScript
const api = new apigateway.StepFunctionsRestApi(this, 'StepFunctionsRestApi', { stateMachine: stateMachine });
Python
api = apigw.StepFunctionsRestApi(self, "StepFunctionsRestApi", state_machine = state_machine)
Java
StepFunctionsRestApi api = StepFunctionsRestApi.Builder.create(this, "StepFunctionsRestApi") .stateMachine(stateMachine) .build();
C#
var api = new StepFunctionsRestApi(this, "StepFunctionsRestApi", new StepFunctionsRestApiProps { StateMachine = stateMachine });
Go
awsapigateway.NewStepFunctionsRestApi(stack, jsii.String("StepFunctionsRestApi"), &awsapigateway.StepFunctionsRestApiProps { StateMachine = stateMachine, })

Untuk membangun dan menyebarkan AWS CDK aplikasi

Dalam AWS CDK proyek yang Anda buat, edit file yang berisi definisi tumpukan agar terlihat seperti kode di bawah ini. Anda akan mengenali definisi mesin status Step Functions dan API Gateway dari atas.

TypeScript

Perbarui lib/stepfunctions-rest-api-stack.ts untuk membaca sebagai berikut.

import * as cdk from 'aws-cdk-lib'; import * as stepfunctions from 'aws-cdk-lib/aws-stepfunctions' import * as apigateway from 'aws-cdk-lib/aws-apigateway'; export class StepfunctionsRestApiStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); const machineDefinition = new stepfunctions.Pass(this, 'PassState', { result: {value:"Hello!"}, }); const stateMachine = new stepfunctions.StateMachine(this, 'MyStateMachine', { definition: machineDefinition, stateMachineType: stepfunctions.StateMachineType.EXPRESS, }); const api = new apigateway.StepFunctionsRestApi(this, 'StepFunctionsRestApi', { stateMachine: stateMachine });
JavaScript

Perbarui lib/stepfunctions-rest-api-stack.js untuk membaca sebagai berikut.

const cdk = require('@aws-cdk/core'); const stepfunctions = require('@aws-cdk/aws-stepfunctions'); const apigateway = require('@aws-cdk/aws-apigateway'); class StepfunctionsRestApiStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const machineDefinition = new stepfunctions.Pass(this, "PassState", { result: {value:"Hello!"}, }) const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: machineDefinition, stateMachineType: stepfunctions.StateMachineType.EXPRESS, }); const api = new apigateway.StepFunctionsRestApi(this, 'StepFunctionsRestApi', { stateMachine: stateMachine }); } } module.exports = { StepStack }
Python

Perbarui stepfunctions_rest_api/stepfunctions_rest_api_stack.py untuk membaca sebagai berikut.

from aws_cdk import App, Stack from constructs import Construct from aws_cdk import aws_stepfunctions as sfn from aws_cdk import aws_apigateway as apigw class StepfunctionsRestApiStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) machine_definition = sfn.Pass(self,"PassState", result = sfn.Result("Hello")) state_machine = sfn.StateMachine(self, 'MyStateMachine', definition = machine_definition, state_machine_type = sfn.StateMachineType.EXPRESS) api = apigw.StepFunctionsRestApi(self, "StepFunctionsRestApi", state_machine = state_machine)
Java

Perbarui src/main/java/com.myorg/StepfunctionsRestApiStack.java untuk membaca sebagai berikut.

package com.myorg; import software.amazon.awscdk.core.Construct; import software.amazon.awscdk.core.Stack; import software.amazon.awscdk.core.StackProps; import software.amazon.awscdk.services.stepfunctions.Pass; import software.amazon.awscdk.services.stepfunctions.StateMachine; import software.amazon.awscdk.services.stepfunctions.StateMachineType; import software.amazon.awscdk.services.apigateway.StepFunctionsRestApi; public class StepfunctionsRestApiStack extends Stack { public StepfunctionsRestApiStack(final Construct scope, final String id) { this(scope, id, null); } public StepfunctionsRestApiStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Pass machineDefinition = Pass.Builder.create(this, "PassState") .result(Result.fromString("Hello")) .build(); StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine") .definition(machineDefinition) .stateMachineType(StateMachineType.EXPRESS) .build(); StepFunctionsRestApi api = StepFunctionsRestApi.Builder.create(this, "StepFunctionsRestApi") .stateMachine(stateMachine) .build(); } }
C#

Perbarui src/StepfunctionsRestApi/StepfunctionsRestApiStack.cs untuk membaca sebagai berikut.

using Amazon.CDK; using Amazon.CDK.AWS.StepFunctions; using Amazon.CDK.AWS.APIGateway; namespace StepfunctionsRestApi { public class StepfunctionsRestApiStack : Stack { internal StepfunctionsRestApi(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var machineDefinition = new Pass(this, "PassState", new PassProps { Result = Result.FromString("Hello") }); var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { Definition = machineDefinition, StateMachineType = StateMachineType.EXPRESS }); var api = new StepFunctionsRestApi(this, "StepFunctionsRestApi", new StepFunctionsRestApiProps { StateMachine = stateMachine }); } } }
Go

Perbarui stepfunctions-rest-api.go untuk membaca sebagai berikut.

package main import ( "github.com/aws/aws-cdk-go/awscdk" "github.com/aws/aws-cdk-go/awscdk/awsapigateway" "github.com/aws/aws-cdk-go/awscdk/awsstepfunctions" "github.com/aws/constructs-go/constructs/v3" "github.com/aws/jsii-runtime-go" ) type StepfunctionsRestApiGoStackProps struct { awscdk.StackProps } func NewStepfunctionsRestApiGoStack(scope constructs.Construct, id string, props *StepfunctionsRestApiGoStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // The code that defines your stack goes here var machineDefinition = awsstepfunctions.NewPass(stack, jsii.String("PassState"), &awsstepfunctions.PassProps { Result: awsstepfunctions.NewResult(jsii.String("Hello")), }) var stateMachine = awsstepfunctions.NewStateMachine(stack, jsii.String("StateMachine"), &awsstepfunctions.StateMachineProps{ Definition: machineDefinition, StateMachineType: awsstepfunctions.StateMachineType_EXPRESS, }); awsapigateway.NewStepFunctionsRestApi(stack, jsii.String("StepFunctionsRestApi"), &awsapigateway.StepFunctionsRestApiProps{ StateMachine = stateMachine, }) return stack } func main() { app := awscdk.NewApp(nil) NewStepfunctionsRestApiGoStack(app, "StepfunctionsRestApiGoStack", &StepfunctionsRestApiGoStackProps{ awscdk.StackProps{ Env: env(), }, }) app.Synth(nil) } // env determines the AWS environment (account+region) in which our stack is to // be deployed. For more information see: https://docs.aws.amazon.com/cdk/latest/guide/environments.html func env() *awscdk.Environment { // If unspecified, this stack will be "environment-agnostic". // Account/Region-dependent features and context lookups will not work, but a // single synthesized template can be deployed anywhere. //--------------------------------------------------------------------------- return nil // Uncomment if you know exactly what account and region you want to deploy // the stack to. This is the recommendation for production stacks. //--------------------------------------------------------------------------- // return &awscdk.Environment{ // Account: jsii.String("123456789012"), // Region: jsii.String("us-east-1"), // } // Uncomment to specialize this stack for the AWS Account and Region that are // implied by the current CLI configuration. This is recommended for dev // stacks. //--------------------------------------------------------------------------- // return &awscdk.Environment{ // Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")), // Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")), // } }

Simpan file sumber, lalu terbitkan cdk synth di direktori utama aplikasi. Bagian AWS CDK menjalankan aplikasi dan mensintesis AWS CloudFormation template dari itu, lalu menampilkan template.

Untuk benar-benar menyebarkan Amazon API Gateway dan AWS Step Functions negara mesin ke AWS akun Anda, masalahcdk deploy. Anda akan diminta untuk menyetujui IAM kebijakan AWS CDK telah dihasilkan.

Langkah 3: Uji API Gateway

Setelah Anda membuat API Gateway REST API dengan Synchronous Express State Machine sebagai integrasi backend, Anda dapat menguji Gateway. API

Untuk menguji Gateway yang digunakan menggunakan API konsol API Gateway

  1. Buka konsol Amazon API Gateway dan masuk.

  2. Pilih REST API nama AndaStepFunctionsRestApi.

  3. Di panel Resources, pilih ANY metode.

  4. Pilih tab Uji. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

  5. Untuk Metode, pilih POST.

  6. Untuk badan Permintaan, salin parameter permintaan berikut.

    { "key": "Hello" }
  7. Pilih Uji. Informasi berikut akan ditampilkan:

    • Permintaan adalah jalur sumber daya yang dipanggil untuk metode.

    • Status adalah kode HTTP status respon.

    • Latensi adalah waktu antara penerimaan permintaan dari penelepon dan respons yang dikembalikan.

    • Response body adalah HTTP respon body.

    • Header respons adalah header HTTP respons.

    • Log menunjukkan simulasi entri Amazon CloudWatch Logs yang akan ditulis jika metode ini dipanggil di luar konsol API Gateway.

      catatan

      Meskipun entri CloudWatch Log disimulasikan, hasil pemanggilan metode adalah nyata.

Output tubuh Response harus seperti ini:

"Hello"
Tip

Coba API Gateway dengan metode yang berbeda dan input yang tidak valid untuk melihat output kesalahan. Anda mungkin ingin mengubah mesin status untuk mencari kunci tertentu dan selama pengujian memberikan kunci yang salah untuk gagal eksekusi State Machine dan menghasilkan pesan kesalahan dalam output badan Response.

Untuk menguji yang digunakan API menggunakan c URL

  1. Buka jendela terminal.

  2. Salin URL perintah c berikut dan tempel ke jendela terminal, ganti <api-id> dengan API ID Anda API dan <region> dengan wilayah tempat Anda API digunakan.

    curl -X POST\ 'https://<api-id>.execute-api.<region>.amazonaws.com/prod' \ -d '{"key":"Hello"}' \ -H 'Content-Type: application/json'

Output Response Body harus seperti ini:

"Hello"
Tip

Coba API Gateway dengan metode yang berbeda dan input yang tidak valid untuk melihat output kesalahan. Anda mungkin ingin mengubah mesin status untuk mencari kunci tertentu dan selama pengujian memberikan kunci yang salah untuk gagal eksekusi State Machine dan menghasilkan pesan kesalahan dalam output Response Body.

Langkah 4: Bersihkan

Setelah selesai mencoba API Gateway Anda, Anda dapat merobohkan mesin status dan API Gateway menggunakan AWSCDK. Terbitkan cdk destroy di direktori utama aplikasi Anda.