[アップデート]Step FunctionsでCodeBuild統合がサポートされました

Step Functionsにアップデートがあり、AWS CodeBuildとの統合がサポートされました!早速試してみたいと思います。
2020.05.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Step FunctionsでCodeBuildとの統合がサポートされました。

今回のアップデートにより、Lambda Functionsなどを介さず直接、CodeBuildの制御が行えるようになります。ここでは、統合でサポートされている操作の一部(StartBuild)を試してみたいと思います。

事前準備

以下ドキュメントをベースに、CodeBuild(ビルドプロジェクト)を作成しました。

やってみた

ステートマシン作成

ビルド実行を開始するだけの、もの凄いシンプルなステートマシンを作成しました。

定義は以下となります。

{
  "Comment": "An example of using CodeBuild to run tests, get test results and send a notification.",
  "StartAt": "Trigger CodeBuild Build",
  "States": {
    "Trigger CodeBuild Build": {
      "Type": "Task",
      "Resource": "arn:aws:states:::codebuild:startBuild.sync",
      "Parameters": {
        "ProjectName": "codebuild-demo-project"
      },
      "End": true
    }
  }
}

タスクにて、StartBuild APIを呼び出しています。.syncサフィックスを追加してビルド完了まで待機する定義です。ProjectNameで、ビルド実行を開始するプロジェクトの名前を指定しています。

ステートマシンのサービスロールではCodeBuildに対する権限が必要になりますので、IAMロールに必要な権限を付与しています。以下が参考になります。

ステートマシン実行

ステートマシン実行前(ビルド実行前)に、アーティファクト出力先バケットが空であることを確認しました。

$ aws s3api list-objects --bucket codebuild-ap-northeast-1-123456789012-output-bucket
$

ステートマシンを実行します。

$ aws stepfunctions start-execution \
  --state-machine-arn arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:TestCodeBuildStateMachine
{
    "executionArn": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:execution:TestCodeBuildStateMachine:6e7af264-84e7-40e3-8447-a3c94f30616f",
    "startDate": 1588747745.583
}

しばらくすると、ビルドおよびステートマシンの実行が完了しました。

ビルドプロジェクト

ステートマシン

ステートマシン実行後に、アーティファクトが出力されていることを確認しました。

$ aws s3api list-objects --bucket codebuild-ap-northeast-1-123456789012-output-bucket
{
    "Contents": [
        {
            "Key": "codebuild-demo-project/target/messageUtil-1.0.jar",
            "LastModified": "2020-05-06T06:50:58.000Z",
            "ETag": "\"66774fad872c07159a15b92b885ecf4e\"",
            "Size": 2127,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "members-23841",
                "ID": "1679c517d90f700d99ff6c8130d6c44eb13076f7861796180f689ab6843c45ca"
            }
        }
    ]
}

ビルドを実行したステート(ここではTrigger CodeBuild Build)の出力を以下に添付しました。少々長いので折りたたみました。確認する際はクリックして展開してください。

 

Trigger CodeBuild Buildの出力
{
  "SdkHttpMetadata": {
    "HttpHeaders": {
      "Content-Length": "3163",
      "Content-Type": "application/x-amz-json-1.1",
      "Date": "Wed, 06 May 2020 06:51:02 GMT",
      "x-amzn-RequestId": "492dc025-497d-4562-94a9-c4ee94076b1f"
    },
    "HttpStatusCode": 200
  },
  "SdkResponseMetadata": {
    "RequestId": "492dc025-497d-4562-94a9-c4ee94076b1f"
  },
  "Build": {
    "Arn": "arn:aws:codebuild:ap-northeast-1:XXXXXXXXXXXX:build/codebuild-demo-project:d50cd497-65a8-45a6-9d66-b33d64371f65",
    "Artifacts": {
      "EncryptionDisabled": false,
      "Location": "arn:aws:s3:::codebuild-ap-northeast-1-123456789012-output-bucket/codebuild-demo-project",
      "Md5sum": "",
      "OverrideArtifactName": false,
      "Sha256sum": ""
    },
    "BuildComplete": true,
    "BuildNumber": 6,
    "BuildStatus": "SUCCEEDED",
    "Cache": {
      "Type": "NO_CACHE"
    },
    "CurrentPhase": "COMPLETED",
    "EncryptionKey": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:alias/aws/s3",
    "EndTime": 1588747858077,
    "Environment": {
      "ComputeType": "BUILD_GENERAL1_SMALL",
      "EnvironmentVariables": [],
      "Image": "aws/codebuild/amazonlinux2-x86_64-standard:2.0",
      "ImagePullCredentialsType": "CODEBUILD",
      "PrivilegedMode": false,
      "Type": "LINUX_CONTAINER"
    },
    "Id": "codebuild-demo-project:d50cd497-65a8-45a6-9d66-b33d64371f65",
    "Initiator": "states/TestCodeBuildStateMachine",
    "Logs": {
      "CloudWatchLogs": {
        "Status": "DISABLED"
      },
      "S3Logs": {
        "EncryptionDisabled": false,
        "Status": "DISABLED"
      }
    },
    "Phases": [
      {
        "DurationInSeconds": 0,
        "EndTime": 1588747746209,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "SUBMITTED",
        "StartTime": 1588747745873
      },
      {
        "DurationInSeconds": 1,
        "EndTime": 1588747747696,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "QUEUED",
        "StartTime": 1588747746209
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 42,
        "EndTime": 1588747790221,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "PROVISIONING",
        "StartTime": 1588747747696
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 1,
        "EndTime": 1588747791563,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "DOWNLOAD_SOURCE",
        "StartTime": 1588747790221
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 0,
        "EndTime": 1588747791608,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "INSTALL",
        "StartTime": 1588747791563
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 0,
        "EndTime": 1588747791656,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "PRE_BUILD",
        "StartTime": 1588747791608
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 66,
        "EndTime": 1588747857796,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "BUILD",
        "StartTime": 1588747791656
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 0,
        "EndTime": 1588747857841,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "POST_BUILD",
        "StartTime": 1588747857796
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 0,
        "EndTime": 1588747858026,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "UPLOAD_ARTIFACTS",
        "StartTime": 1588747857841
      },
      {
        "Contexts": [
          {
            "Message": "",
            "StatusCode": ""
          }
        ],
        "DurationInSeconds": 0,
        "EndTime": 1588747858077,
        "PhaseStatus": "SUCCEEDED",
        "PhaseType": "FINALIZING",
        "StartTime": 1588747858026
      },
      {
        "PhaseType": "COMPLETED",
        "StartTime": 1588747858077
      }
    ],
    "ProjectName": "codebuild-demo-project",
    "QueuedTimeoutInMinutes": 480,
    "SecondaryArtifacts": [],
    "SecondarySourceVersions": [],
    "SecondarySources": [],
    "ServiceRole": "arn:aws:iam::XXXXXXXXXXXX:role/service-role/codebuild-codebuild-demo-project-service-role",
    "Source": {
      "InsecureSsl": false,
      "Location": "codebuild-ap-northeast-1-123456789012-input-bucket/MessageUtil.zip",
      "Type": "S3"
    },
    "StartTime": 1588747745873,
    "TimeoutInMinutes": 60
  }
}

さいごに

今回は一部のAPIしか利用しませんでしたが、CodeBuild向けにサポートされているAPIは複数あります。

ビルドの定期実行や、テスト結果に応じたアクションなど、ステートマシン側で処理することにより、カスタマイズや作り込みの簡素化などが期待できそうですね。

参考