AWS Step Functions は、Lambda や AWS のサービスを「手順の流れ」としてつなぐサービスです。 流れ(ステートマシン)は、ASL(Amazon States Language)という JSON で書きます。StartAt で最初の状態を決め、States の中に状態を並べて、Next でつなぎます。

{
  "Comment": "最小のステートマシン",
  "StartAt": "Hello",
  "States": {
    "Hello": { "Type": "Pass", "Result": { "message": "hello" }, "Next": "Done" },
    "Done":  { "Type": "Succeed" }
  }
}

状態(State)は8種類です。

Type 何をするか Retry・Catch
Task Lambda や AWS のサービスを呼ぶ(1つの仕事) 書ける
Choice 条件で次の状態を分ける ー
Parallel 複数の枝(Branches)を同時に動かす 書ける
Map 配列の要素ごとに、同じ手順をくり返す 書ける
Wait 決めた秒数、または日時まで待つ ー
Pass 入力をそのまま渡す。値を足す・作り変える ー
Succeed 成功で終わる ー
Fail 失敗で終わる(Error・Cause を付けられる) ー

確認環境:Python 3.11(Linux)・boto3 1.43.111・moto 5.2.4。AWS には接続していません。moto の Step Functions モックの「定義を実際に実行する」設定(execute_state_machine)で、JSONPath のステートマシンを作成・実行し、出力と実行履歴を取りました。JSONata の式は jsonata-python 0.7.1 で値を確かめました。Lambda の例外の形は、AWS 公開のランタイムクライアント awslambdaric 4.2.0 で確かめました。各項目の意味・既定値は、AWS の公式ドキュメントで確かめました(確認日 2026年10月12日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Step Functions入門|ASLの書き方とLambda連携・Retry」

Step Functions の基本

用語 意味
ステートマシン 流れ全体。ASL の JSON で定義する
状態(State) 流れの1つの箱。Type で種類を決める
実行(Execution) ステートマシンを1回動かしたもの。入力の JSON を渡して始める
実行履歴 どの状態に入り、出たか、失敗したかの記録

Standard と Express の違い

ステートマシンを作るときに、種類を選びます。作ったあとで種類は変えられません(ドキュメントの記載)。

項目 Standard Express
最長の実行時間 1年 5分
実行の保証 exactly-once(ちょうど1回) 非同期は at-least-once、同期は at-most-once
料金の元 状態の遷移の回数 実行の回数・時間・メモリ
.sync・.waitForTaskToken 使える 使えない
実行履歴 API とコンソールで見られる CloudWatch Logs のログ設定で見る

人の承認を待つ、長いバッチを待つといった流れは Standard です。短い処理を大量に流すなら Express が候補になります。

ASL の書き方:共通の項目

項目 書く場所 意味
StartAt 一番上(必須) 最初に動かす状態の名前
States 一番上(必須) 状態の名前をキーにした JSON
QueryLanguage 一番上・各状態 "JSONPath"(省略時)か "JSONata"
Type 各状態(必須) 状態の種類
Next 各状態 次の状態の名前(完全に一致させる)
End 各状態 true で、この状態で終わる
Comment どこでも 説明文

ドキュメントでは、Succeed と Fail 以外の状態は Next が要り、代わりに End: true で終わらせることもできます。Choice は、Choices の中の条件ごとに Next を書きます。

8種類の状態を全部使った例(JSONPath)

注文を受けて、金額で分け、明細ごとに処理し、2つの仕事を同時に動かす例です。moto で作成・実行しました。

{
  "Comment": "注文の流れ(JSONPath)",
  "StartAt": "Init",
  "States": {
    "Init": {
      "Type": "Pass",
      "Result": { "tax": 0.1 },
      "ResultPath": "$.config",
      "Next": "CheckAmount"
    },
    "CheckAmount": {
      "Type": "Choice",
      "Choices": [
        { "Variable": "$.amount", "NumericGreaterThanEquals": 10000, "Next": "BigOrder" },
        { "Variable": "$.amount", "NumericLessThan": 0, "Next": "Invalid" }
      ],
      "Default": "Items"
    },
    "BigOrder": { "Type": "Wait", "Seconds": 1, "Next": "Items" },
    "Items": {
      "Type": "Map",
      "ItemsPath": "$.items",
      "ResultPath": "$.lines",
      "ItemProcessor": {
        "ProcessorConfig": { "Mode": "INLINE" },
        "StartAt": "Line",
        "States": {
          "Line": { "Type": "Pass", "Parameters": { "sku.$": "$.sku", "qty.$": "$.qty" }, "End": true }
        }
      },
      "Next": "Both"
    },
    "Both": {
      "Type": "Parallel",
      "ResultPath": "$.parallel",
      "Branches": [
        { "StartAt": "A", "States": { "A": { "Type": "Pass", "Result": "mail sent", "End": true } } },
        { "StartAt": "B", "States": { "B": { "Type": "Pass", "Result": "stock reserved", "End": true } } }
      ],
      "Next": "Done"
    },
    "Done": { "Type": "Succeed" },
    "Invalid": { "Type": "Fail", "Error": "InvalidAmount", "Cause": "amount must be >= 0" }
  }
}

入力 {"orderId": "o-1", "amount": 12000, "items": [{"sku": "A1", "qty": 2}, {"sku": "B2", "qty": 1}]} で実行した結果です。

status: SUCCEEDED
output: {"orderId": "o-1", "amount": 12000, "items": [...], "config": {"tax": 0.1},
         "lines": [{"sku": "A1", "qty": 2}, {"sku": "B2", "qty": 1}],
         "parallel": ["mail sent", "stock reserved"]}

実行履歴(get_execution_history)は30件でした。主な流れは次のとおりです。

 1 ExecutionStarted
 2 PassStateEntered Init
 4 ChoiceStateEntered CheckAmount
 6 WaitStateEntered BigOrder          ← 12000 >= 10000 なので Wait へ
 8 MapStateEntered Items
10 MapIterationStarted Items          ← 明細2件で2回
18 MapStateSucceeded
20 ParallelStateEntered Both
26 ParallelStateSucceeded
28 SucceedStateEntered Done
30 ExecutionSucceeded

amount を -5 にすると、Fail で止まりました。

status: FAILED
error: InvalidAmount
cause: amount must be >= 0
 4 ChoiceStateEntered CheckAmount
 6 FailStateEntered Invalid
 7 ExecutionFailed InvalidAmount
状態 主な項目(ドキュメント)
Choice Choices(条件と Next)、Default(どれにも合わないとき)
Wait Seconds・Timestamp・SecondsPath・TimestampPath のどれか 1つ。最長は Standard 1年、Express 5分
Map ItemProcessor(必須)、ItemsPath(JSONPath)/Items(JSONata)、MaxConcurrency(既定 0=上限なし)
Parallel Branches。結果は枝の順の配列
Fail Error・Cause

Wait の Timestamp は 2026-10-12T09:00:00Z の形(大文字の T と Z)です。Map の Inline モードは、ドキュメントでは同時に最大40回の反復までです。

Lambda をつなぐ

Lambda を呼ぶ Task は、Resource に arn:aws:states:::lambda:invoke を書きます。 関数名と、関数に渡すデータ(Payload)を指定します。ドキュメントのチュートリアルは JSONata で書かれています。

{
  "QueryLanguage": "JSONata",
  "StartAt": "CalcTotal",
  "States": {
    "CalcTotal": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Arguments": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:123456789012:function:calc-total:$LATEST",
        "Payload": "{% $states.input %}"
      },
      "Output": "{% $states.result.Payload %}",
      "End": true
    }
  }
}

同じことを JSONPath で書くと、こうなります。

{
  "StartAt": "CalcTotal",
  "States": {
    "CalcTotal": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:123456789012:function:calc-total:$LATEST",
        "Payload.$": "$"
      },
      "ResultSelector": { "body.$": "$.Payload" },
      "ResultPath": "$.calc",
      "End": true
    }
  }
}

呼ばれる Lambda(Python)の例です。

class OrderNotFound(Exception):
    pass

def lambda_handler(event, context):
    if event.get("orderId") == "none":
        raise OrderNotFound(f"order {event['orderId']} not found")
    return {"orderId": event["orderId"],
            "total": sum(i["price"] * i["qty"] for i in event["items"])}

awslambdaric で動かすと、成功時は {"orderId": "o-1", "total": 11000} を返しました。例外のときは、次の本文になりました。errorType に例外のクラス名が入ります。 Step Functions では、これがエラー名として ErrorEquals で使えます(ドキュメントのチュートリアルでは CustomError)。

{"errorMessage": "order none not found", "errorType": "OrderNotFound", "requestId": "req-1", "stackTrace": ["..."]}

結果は Payload に包まれる

lambda:invoke の結果は、関数の戻り値がそのまま出てくるのではなく、Payload の中に入ります。 ドキュメントの例は次の形です。

{
  "ExecutedVersion": "$LATEST",
  "Payload": "FUNCTION OUTPUT",
  "SdkHttpMetadata": { "HttpHeaders": { "...": "..." }, "HttpStatusCode": 200 },
  "SdkResponseMetadata": { "RequestId": "6b3bebdb-..." },
  "StatusCode": 200
}

そのため、JSONata では $states.result.Payload、JSONPath では ResultSelector の $.Payload で取り出します。moto(Lambda のコードは動かさず、入力をそのまま返す設定)で試すと、包み方の違いが出力に表れました。

書き方 実行の出力(moto)
Parameters だけ {"StatusCode": 200, "Payload": {"price": 100}}
ResultSelector + ResultPath: "$.calc" {"price": 100, "calc": {"body": {"price": 100}}}
Resource に関数の ARN を直接書く {"price": 100}
Lambda の呼び方 結果 違い(ドキュメント)
arn:aws:states:::lambda:invoke Payload に包まれる .waitForTaskToken(コールバック)が使える
Resource に関数の ARN 関数の出力だけ .waitForTaskToken は使えない

ステートマシンの IAM ロール

ステートマシンには実行ロールを付けます。Lambda を呼ぶなら lambda:InvokeFunction です。ドキュメントでは、FunctionName に :$LATEST やエイリアスを付けるなら、Resource の ARN の末尾に :* を付けるよう書かれています。付けないと Access Denied になります。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "lambda:InvokeFunction",
    "Resource": [
      "arn:aws:lambda:ap-northeast-1:123456789012:function:calc-total",
      "arn:aws:lambda:ap-northeast-1:123456789012:function:calc-total:*"
    ]
  }]
}

IAM ポリシーの読み方は、関連記事「IAMポリシーの書き方|JSONの読み方と最小権限の作り方【例文つき】」で扱っています。

JSONata と JSONPath の違い

QueryLanguage で、データの取り出し方・作り方を選びます。 省略すると JSONPath です。状態ごとに変えることもできます。

項目 JSONPath(既定) JSONata
入力を加工する項目 InputPath・Parameters・ResultSelector・ResultPath・OutputPath の5つ Arguments・Output の2つ
値を式で書く キーの末尾に .$("title.$": "$.title") 値を {% %} で囲む("title": "{% $states.input.title %}")
状態の入力・結果 $(入力)、ResultPath で結果の置き場所を決める $states.input、$states.result、$states.errorOutput、$states.context
Choice の条件 Variable + NumericGreaterThan など Condition("{% $states.input.total >= 10000 %}")
組み込み関数 States.Format などの intrinsic 関数 JSONata の関数($sum・$uuid・$hash など)

ドキュメントでは、Arguments・Output は JSONata 専用、Parameters などのパス系の項目は JSONPath 専用で、混ぜると定義として無効です。{% %} は、前後に空白を入れずに書きます。

同じ処理を JSONata で書く

{
  "QueryLanguage": "JSONata",
  "StartAt": "Calc",
  "States": {
    "Calc": {
      "Type": "Pass",
      "Output": {
        "orderId": "{% $states.input.orderId %}",
        "total": "{% $sum($states.input.items.(price * qty)) %}",
        "skus": "{% $states.input.items.sku %}"
      },
      "Assign": { "customer": "{% $states.input.customer %}" },
      "Next": "Check"
    },
    "Check": {
      "Type": "Choice",
      "Choices": [{ "Condition": "{% $states.input.total >= 10000 %}", "Next": "Big" }],
      "Default": "Small"
    },
    "Big":   { "Type": "Pass", "Output": { "result": "{% 'big order for ' & $customer %}" }, "End": true },
    "Small": { "Type": "Pass", "Output": { "result": "small" }, "End": true }
  }
}

Assign は変数($customer)を作る項目で、あとの状態から参照できます。式の値を、入力 {"orderId": "o-1", "customer": "山田", "items": [{"sku": "A1", "price": 4000, "qty": 2}, {"sku": "B2", "price": 3000, "qty": 1}]} で確かめました。

式 値
$sum($states.input.items.(price * qty)) 11000
$states.input.items.sku ["A1", "B2"]
$count($states.input.items) 2
'big order for ' & $states.input.customer "big order for 山田"
$states.input.items[price >= 3500].sku "A1"(1件だと配列にならない)
$states.input.items[price >= 3500].sku[] ["A1"]([] を付けると配列のまま)

JSONata は、結果が1件だけだと配列ではなく値そのものを返します。 次の Map の Items に渡すときなど、配列が要る場面では末尾に [] を付けます。

moto 5.2.4 では、JSONata のステートマシンは作成できましたが、実行は JSONata の評価で States.Runtime になりました(moto は JSONata の評価に Java の実行環境を使うため)。上の JSONata の値は、jsonata-python で式だけを評価したものです。

Retry と Catch の書き方

Retry は「同じ状態をもう一度」、Catch は「あきらめて別の状態へ」です。 両方あるときは、Retry を使い切ってから Catch に進みます。Task・Parallel・Map に書けます。

"GetOrder": {
  "Type": "Task",
  "Resource": "arn:aws:states:::dynamodb:getItem",
  "Parameters": { "TableName": "Orders", "Key": { "orderId": { "S.$": "$.orderId" } } },
  "ResultPath": "$.item",
  "Retry": [
    { "ErrorEquals": ["DynamoDB.ProvisionedThroughputExceededException"], "IntervalSeconds": 1, "MaxAttempts": 3 },
    { "ErrorEquals": ["States.ALL"], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 2.0 }
  ],
  "Catch": [
    { "ErrorEquals": ["States.ALL"], "ResultPath": "$.error", "Next": "Notify" }
  ],
  "Next": "Done"
}

存在しないテーブルを読ませて、moto で実行した履歴です。最初の1回+再試行2回で、計3回失敗してから Catch に進みました。 実行全体は約4.3秒で、待ち時間 1秒 → 2秒(BackoffRate 2.0)が入っています。

 2 TaskStateEntered GetOrder
 5 TaskFailed DynamoDB.ResourceNotFoundException
 8 TaskFailed DynamoDB.ResourceNotFoundException
11 TaskFailed DynamoDB.ResourceNotFoundException
12 TaskStateExited GetOrder
13 PassStateEntered Notify
15 ExecutionSucceeded

Catch の ResultPath: "$.error" により、元の入力にエラーの情報が足されて次の状態に渡りました。

{"orderId": "o-1",
 "error": {"Error": "DynamoDB.ResourceNotFoundException",
           "Cause": "Requested resource not found (Service: AmazonDynamoDBv2; Status Code: 400; ...)"}}

存在しない Lambda を lambda:invoke で呼んだときは、Lambda.ResourceNotFoundException で Catch に進みました。

Retry の項目と既定値

項目 既定値 意味(ドキュメント)
ErrorEquals 必須 対象のエラー名の配列
IntervalSeconds 1 最初の再試行までの秒数
MaxAttempts 3 再試行の最大回数。0 で再試行しない
BackoffRate 2.0 再試行ごとに待ち時間を何倍にするか
MaxDelaySeconds 上限なし 待ち時間の上限(秒)
JitterStrategy NONE FULL で待ち時間をばらつかせる

IntervalSeconds: 3、BackoffRate: 2、MaxAttempts: 3 なら、待ち時間は 3秒・6秒・12秒の計算です。待ち時間とジッターの考え方は、関連記事「指数バックオフとは?リトライ間隔の決め方とジッターの実装」で扱っています。

Catch の項目

項目 意味
ErrorEquals 必須。対象のエラー名
Next 必須。移る状態の名前
ResultPath(JSONPath) エラー情報の置き場所。省略すると $ で、入力全体がエラー情報に置き換わる
Output・Assign(JSONata) $states.errorOutput でエラー情報を参照できる

ResultPath を省略すると元の注文データが消えるので、"$.error" のように場所を決めておくと、後の状態で元のデータとエラーの両方を使えます。

よく使うエラー名

エラー名 いつ出るか(ドキュメント)
States.ALL どのエラーにも合う。単独で、最後の Retry/Catch に書く。States.Runtime と States.DataLimitExceeded には合わない
States.TaskFailed Task の失敗。States.Timeout 以外に合う
States.Timeout TimeoutSeconds を超えた、またはハートビートが途切れた
States.Permissions 実行ロールの権限が足りない
States.Runtime 処理できない例外で実行が失敗した。再試行も Catch もできない
States.DataLimitExceeded 入出力が上限を超えた。明示すれば捕まえられる
Lambda.ServiceException など Lambda 側の一時的なエラー
Lambda.TooManyRequestsException Lambda の同時実行の上限
自分の例外クラス名 Lambda の errorType(例:OrderNotFound)

ドキュメントのベストプラクティスでは、Lambda の一時的なエラーを次の形で再試行する例が載っています。

"Retry": [{
  "ErrorEquals": ["Lambda.ClientExecutionTimeoutException", "Lambda.ServiceException",
                  "Lambda.AWSLambdaException", "Lambda.SdkClientException"],
  "IntervalSeconds": 2,
  "MaxAttempts": 6,
  "BackoffRate": 2
}]

TimeoutSeconds を付ける

Task の TimeoutSeconds の既定値は 99,999,999 秒です。ドキュメントのベストプラクティスでは、タイムアウトを付けないと、応答が来ない Task で実行が止まったままになるとして、TimeoutSeconds を付けるよう勧めています。超えると States.Timeout になり、Retry・Catch で扱えます。

作成と実行(AWS CLI・boto3)

AWS CLI では、定義を file:// で渡します。

aws stepfunctions create-state-machine \
  --name order-flow \
  --definition file://order-flow.asl.json \
  --role-arn arn:aws:iam::123456789012:role/sfn-order-flow

aws stepfunctions start-execution \
  --state-machine-arn arn:aws:states:ap-northeast-1:123456789012:stateMachine:order-flow \
  --input '{"orderId":"o-1","amount":12000,"items":[{"sku":"A1","qty":2}]}'

aws stepfunctions describe-execution --execution-arn <start-executionの返したARN>
aws stepfunctions get-execution-history --execution-arn <同上>

moto で試したときの boto3 のコードです。テストでも同じ形で使えます。

import json, time, boto3
from moto import mock_aws

definition = {"StartAt": "Hello", "States": {"Hello": {"Type": "Pass", "End": True}}}

with mock_aws(config={"stepfunctions": {"execute_state_machine": True}}):
    sfn = boto3.client("stepfunctions", region_name="ap-northeast-1")
    arn = sfn.create_state_machine(
        name="demo", definition=json.dumps(definition),
        roleArn="arn:aws:iam::123456789012:role/sfn-role",
    )["stateMachineArn"]
    ex = sfn.start_execution(stateMachineArn=arn, input=json.dumps({"a": 1}))["executionArn"]
    while (d := sfn.describe_execution(executionArn=ex))["status"] == "RUNNING":
        time.sleep(0.1)
    print(d["status"], d.get("output"))
    for e in sfn.get_execution_history(executionArn=ex)["events"]:
        print(e["id"], e["type"])

moto は定義の検査がゆるい点に注意します。 次の定義は、moto 5.2.4 ではどれも作成できました。

定義 moto 5.2.4 ドキュメントの決まり
JSONPath の状態に Output 作成できた Output は JSONata 専用
Next が存在しない状態名 作成できた 状態名と完全に一致させる
["States.ALL", "States.Timeout"] の Catch 作成できた States.ALL は単独で書く
JSONata の状態に Parameters 作成で失敗 Parameters は JSONPath 専用

AWS 上では、ValidateStateMachineDefinition API(CLI は aws stepfunctions validate-state-machine-definition)で、作る前に定義を検査できます。CI で定義ファイルを検査すると、間違いに早く気づけます。

よくある質問

Q. ASL は YAML で書けますか。 A. API に渡す定義は JSON です。AWS SAM や CDK を使うと、テンプレートの中で書いて JSON に変換できます。SAM は関連記事「AWS SAM入門|template.yamlの書き方とbuild・deploy」、CDK は関連記事「AWS CDK入門|TypeScriptでS3とLambdaを作りsynthまで」で扱っています。

Q. JSONPath と JSONata、どちらで書き始めますか。 A. ドキュメントの Lambda 連携のページや、エラー処理のチュートリアルの例は JSONata で書かれています。項目が Arguments と Output の2つに減り、計算や絞り込みも式で書けます。既存の JSONPath の定義は、状態ごとに QueryLanguage を変えて少しずつ移せます。

Q. Lambda の中でリトライするのと、Retry で再実行するのはどう違いますか。 A. Retry は状態ごと呼び直すので、Lambda の処理が途中まで進んでいても、もう一度最初から動きます。同じ注文を二重に登録しないよう、処理を冪等(何回やっても結果が同じ)にしておきます。考え方は関連記事「冪等性とは?API設計での意味と冪等キーの実装方法」で扱っています。

Q. Lambda の書き方から知りたいです。 A. ハンドラの書き方とローカルでの確かめ方は、関連記事「AWS Lambda Python入門|3.14対応handler例とローカルテスト」で扱っています。

まとめ

  • ASL は StartAt・States・各状態の Type と Next/End が骨格
  • 状態は Task・Choice・Parallel・Map・Wait・Pass・Succeed・Fail の8種類
  • Lambda は arn:aws:states:::lambda:invoke。結果は Payload に包まれる
  • JSONata は Arguments・Output・{% %}、JSONPath は Parameters・ResultPath・.$。混ぜられない
  • Retry の既定は 間隔1秒・3回・2倍。moto では最初の1回+再試行2回のあと Catch に進んだ
  • Catch の ResultPath を省略すると入力が消える。"$.error" などに置く
  • States.ALL は 単独で最後に。moto は検査がゆるいので、AWS の検証 API でも確かめる

参考・出典

確認日はいずれも 2026年10月12日です。

  • AWS Step Functions デベロッパーガイド「Discovering workflow states to use in Step Functions」:https://docs.aws.amazon.com/step-functions/latest/dg/workflow-states.html
  • AWS Step Functions デベロッパーガイド「Handling errors in Step Functions workflows」:https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html
  • AWS Step Functions デベロッパーガイド「Transforming data with JSONata in Step Functions」:https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html
  • AWS Step Functions デベロッパーガイド「Invoke an AWS Lambda function with Step Functions」:https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html
  • AWS Step Functions デベロッパーガイド「Task workflow state」:https://docs.aws.amazon.com/step-functions/latest/dg/state-task.html
  • AWS Step Functions デベロッパーガイド「Wait workflow state」:https://docs.aws.amazon.com/step-functions/latest/dg/state-wait.html
  • AWS Step Functions デベロッパーガイド「Map state in Inline mode」:https://docs.aws.amazon.com/step-functions/latest/dg/state-map-inline.html
  • AWS Step Functions デベロッパーガイド「Choosing workflow type in Step Functions」:https://docs.aws.amazon.com/step-functions/latest/dg/choosing-workflow-type.html
  • AWS Step Functions デベロッパーガイド「Best practices for Step Functions」:https://docs.aws.amazon.com/step-functions/latest/dg/sfn-best-practices.html
  • AWS Step Functions デベロッパーガイド「Handling error conditions using a Step Functions state machine」:https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-handling-error-conditions.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Step Functions入門|ASLの書き方とLambda連携・Retry」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?