AWS CLIを使ったCodeBuild環境変数の更新
2024-12-10
azblob://2024/12/09/eyecatch/2024-12-10-codebuild-aws-cli-update-000.jpg

こちらの記事はFIXER Advent Calendar2024の記事になります。

はじめに

業務でCodeBuildプロジェクトを手動で作成する機会があり、その際に環境変数をコンソールで入力していくのが面倒だったのでAWS CLIを使用できないかと調べました。

こういった場面ではCDKやTerraformなどのIaCを利用することが多いと思いますが、AWS CLIの方がセットアップや操作が簡単なことなど、メリットはあります。

前提

  • AWS CLIのインストール&必要な権限設定
  • jqのインストール
  • 環境変数のJSONファイルを用意
  • 実行環境:Ubuntu24

手順の概要

環境変数を適用させるためのコマンドはないので、少し複雑となっています。以下の手順で行っていきます。

  1. CodeBuildプロジェクトをJSON形式で取得
  2. 取得したJSONファイルを整形
  3. 環境変数のJSONファイルを追記
  4. CodeBuildプロジェクトをアップデート

詳細手順

CodeBuildプロジェクトをJSON形式で取得

まず環境変数を設定したいプロジェクトをJSON形式で取得します。

aws codebuild batch-get-projects --names <プロジェクト名> > preupdate-project.json

取得したJSONを整形

今回の注意点ですが「aws codebuild batch-get-projects」で取得するJSONは、この後の「aws codebuild update-project」で使用する更新用JSONと形式が異なるため直接使用することができません。そのため、取得したJSONを整形する工程が必要となります。更新用JSONを手動で作成するのは面倒なので、今回はjqを使用して取得したJSONを更新用JSONの形式に置き換えました。

jq '
{
  "name": .projects[0].name,
  "source": {
    "type": .projects[0].source.type,
    "location": .projects[0].source.location,
    "gitCloneDepth": .projects[0].source.gitCloneDepth,
    "buildspec": .projects[0].source.buildspec,
    "insecureSsl": .projects[0].source.insecureSsl,
    "reportBuildStatus": .projects[0].source.reportBuildStatus,
    "gitSubmodulesConfig": {
      "fetchSubmodules": .projects[0].source.gitSubmodulesConfig.fetchSubmodules
    },
    "auth": {
      "type": .projects[0].source.auth.type,
      "resource": .projects[0].source.auth.resource
    }
  },
  "sourceVersion": .projects[0].sourceVersion,
  "artifacts": {
    "type": .projects[0].artifacts.type
  },
  "environment": {
    "type": .projects[0].environment.type,
    "image": .projects[0].environment.image,
    "computeType": .projects[0].environment.computeType,
    "environmentVariables": .projects[0].environment.environmentVariables,
    "privilegedMode": .projects[0].environment.privilegedMode,
    "imagePullCredentialsType": .projects[0].environment.imagePullCredentialsType
  },
  "serviceRole": .projects[0].serviceRole,
  "timeoutInMinutes": .projects[0].timeoutInMinutes,
  "queuedTimeoutInMinutes": .projects[0].queuedTimeoutInMinutes,
  "encryptionKey": .projects[0].encryptionKey,
  "logsConfig": {
    "cloudWatchLogs": {
      "status": .projects[0].logsConfig.cloudWatchLogs.status
    },
    "s3Logs": {
      "status": .projects[0].logsConfig.s3Logs.status,
      "location": .projects[0].logsConfig.s3Logs.location,
      "encryptionDisabled": .projects[0].logsConfig.s3Logs.encryptionDisabled
    }
  }
}' preupdate-project.json > update-project.json

注意点として、今回はソースプロバイダとしてgithubを使用しているので、gitCloneDepthなど特有のキーを持っていますがソースプロバイダにS3などを使うとキー自体がなくなるので更新が上手く効かない可能性があります。その場合、必要に応じてプロパティを操作する必要があります。

JSONに環境変数を追記

整形したファイルのenviromentの中のenvironmentVariablesに用意しておいた環境変数のJSONを追記します。環境変数のJSON形式は以下のようにします。

[
  {
    "name": "dummy1",
    "value": "dummy",
    "type": "PARAMETER_STORE"
  },
  {
    "name": "dummy2",
    "value": "dummy",
    "type": "PLAINTEXT"
  }
]

CodeBuildプロジェクトを更新

最後にCodeBuildプロジェクトを更新するコマンドを実行します。

aws codebuild update-project --cli-input-json file://update-project.json

更新後のJSONが出力されれば成功です。

以上で環境変数の設定は完了です。

トラブルシューティング

実際に詰まったエラーについて解決方法を記載していきます。

Invalid type for parameter xxxxxx, value: None, type: <class 'NoneType'>, valid types: <class 'int'>

存在しないキーをjqで指定した場合、そのキーの値にnullを入れるためこのエラーが発生します。nullとなっているキーは必要ないので削除することで解決できます。

An error occurred (InvalidInputException) when calling the UpdateProject operation: EnvironmentVariable name cannot be duplicated

環境変数に同じキー名を複数使用している場合このエラーが発生します。キーが重複しないように設定することで解決します。

Unknown parameter in input: "xxxxx", must be one of: name, description, source, secondarySources, sourceVersion, secondarySourceVersions, artifacts, secondaryArtifacts, cache, environment, serviceRole, timeoutInMinutes, queuedTimeoutInMinutes, encryptionKey, tags, vpcConfig, badgeEnabled, logsConfig, fileSystemLocations, buildBatchConfig, concurrentBuildLimit

要約すると「そんなパラメータ存在しない、このパラメータを入れて」というエラーです。取得したJSONのキーで不要なものが紛れていたりするとこのエラーが発生します。

最後に

今回はAWS CLIを使用して環境変数の更新を行いましたが、ニーズに応じてツール・サービスを選択しましょう。

参考資料