見出し画像

AWS CDK で類似学生計算エンジンを定義して、 IaC の良さを感じる④

はじめに

こんにちは!株式会社POLでエンジニアをやっている @mejihabenatawa です!

POLは「研究者の可能性を最大化するプラットフォームを創造する」をビジョンに、理系学生に特化した採用サービス、および研究開発者・技術者に特化した転職/採用サービスの2サービスを運営しています。

前回のテックブログで AWS CDK で類似学生計算エンジンの AWS Batch 部分について紹介したので、今回は CDKにおける AWS Step Functions 部分の書き方を紹介していきたいと思います。

1. 全体構成編

2. AWS Glue 編

3. AWS Batch 編

4. AWS Step Functions 編(今回)

事前に用意するスクリプト

今回は今まで作ってきたモジュールたちをつなげるコードを書くので、今までのコードがあれば大丈夫です。

今回編集する主なファイルの構成は以下になります。cdk ディレクトリ配下の cdk-stack.ts を編集していきます。

-- project
|-- batch                                 -- AWS Batch 関連のディレクトリ
|    |-- src
|    |    |--    
|    |
|
|-- cdk                                   -- AWS CDK 関連のディレクトリ
|    |-- bin
|    |    |-- cdk.ts
|    |
|    |-- lib 
|    |    |-- cdk-stack.ts
|
|-- glue                                                                  -- AWS Glue 関連のディレクトリ
|    |-- src
|         |--
|
|-- README.md
|
|-- cdk.json

AWS Step Functions について

AWS Step Functions とは簡単に言うと「AWS のサービスを組み合わせることができるサービス」です。

Step Functions はステートマシンとタスクに基づいています。ステートマシンはワークフローを意味し、タスクはワークフロー内での作業単位です。タスクでは Glue や AWS Batch, AWS Lambda などの処理を行うことができます。

今回は、「Glue のタスク」→ 「AWS Batch のタスク」というワークフローを構築します。

前回までの整理

cdk-stack.ts の 100行目で Glue のジョブを定義し、141行目で AWS Batch のジョブを定義しました。今回はそれらを繋げればよいので、その続きを編集します。

CDK上で作成するもの

大きく分けて、以下の4つのことをしました
①前回までに定義した Glue のジョブ定義から、Glue のタスクを作成。
②前回までに定義した AWS Batch のジョブ定義から、Batch のタスクを作成。
③①と②をもとにステートマシンを作成。
④EventBridge でステートマシンが動作する周期を設定。

cdk-stack.ts

# import classes

export interface Context {
 // 変数たち
}


export class CdkStack extends cdk.Stack {
    constructor(
        scope: cdk.Construct,
        id: string,
        context: Context,
        props?: cdk.StackProps
    ){
        super(scope, id, props);
        // #region Glue
   
        // #endregion Glue
       
        // #region AWS Batch
       
        // #endregion AWS Batch
       
        // #region Step Functions
        // Step Functions
        
        // エラー状態を定義
        const errorHandlerState = new sfn.Fail(this, "jobFailed", {
            cause: "Invalid response.",
            error: "ErrorA",
        })

        // Glue のタスク
        const glueJobTask = new tasks.GlueStartJobRun(
            this,
            `GlueTask-${context.ENVStage}`,
            {
                glueJobName: glueJob.name || "",
                resultPath: '$.firstResult',
                integrationPattern: sfn.IntegrationPattern.RUN_JOB
            }
        ).addCatch(errorHandlerState);
       
        // AWS Batch のタスク
        const AWSBatchTask = new tasks.BatchSubmitJob(
         this,
         `BatchTask-${context.ENVStage}`,
         {
           jobDefinitionArn: awsBatch.jobDefinitionArn, 
           jobName: batchName,
           jobQueueArn: awsBatch.jobQueueArn,
           resultPath: '$.secondResult',
            }
        ).addCatch(errorHandlerState);
        
        // Glue のタスクの後に AWS Batch のタスクが動作するようにワークフローの定義を作成
        const definition = glueJobTask.next(AWSBatchTask);
        
        // ロググループを作成
        const logGroup = new logs.LogGroup(this, 'aws/statemachine/keywordBERT');
        
        // State Machine
        const stateMachine = new sfn.StateMachine(this, `StateMachine-${context.ENVStage}`, {
            definition,
            timeout: cdk.Duration.minutes(150),
            logs: {
                destination: logGroup,
                level: sfn.LogLevel.ALL,
            }
        });
        
        // Event Bridge によって、ステートマシンが動作する日時を指定
        const stateMachineTarget = new targets.SfnStateMachine(stateMachine);
        
        new Rule(this, `ScheduleRule-${context.ENVStage}`, {
            schedule: Schedule.cron({ minute: '0', hour: context.EventBridgeHour, weekDay: context.EventBridgeWeekday}),
            targets: [stateMachineTarget],
        });
        
        // #endregion Step Functions
    }
}

それぞれの処理に関する説明はコメントに記載しました。省いている部分もあるので、不明点があれば Twitter などに連絡ください!

まとめ

今回は AWS CDK における AWS Step Functions の定義の仕方を説明しました。サンプルコード をこちらになります。

今回で類似学生エンジンを CDK で定義する話はおしまいです!ぜひ、サンプルコードなど見ながらやってみていただければと思います。長期間ありがとうございました!

POLでは引き続き、類似学生やレコメンドなどの機械学習周りのことをやっているので、ぜひ話を聞きたい方などいましたら、連絡してください!

いいなと思ったら応援しよう!