こちらの記事はFIXER Advent Calendar2024の記事になります。
はじめに
業務でCodeBuildプロジェクトを手動で作成する機会があり、その際に環境変数をコンソールで入力していくのが面倒だったのでAWS CLIを使用できないかと調べました。
こういった場面ではCDKやTerraformなどのIaCを利用することが多いと思いますが、AWS CLIの方がセットアップや操作が簡単なことなど、メリットはあります。
前提
- AWS CLIのインストール&必要な権限設定
- jqのインストール
- 環境変数のJSONファイルを用意
- 実行環境:Ubuntu24
手順の概要
環境変数を適用させるためのコマンドはないので、少し複雑となっています。以下の手順で行っていきます。
- CodeBuildプロジェクトをJSON形式で取得
- 取得したJSONファイルを整形
- 環境変数のJSONファイルを追記
- 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を使用して環境変数の更新を行いましたが、ニーズに応じてツール・サービスを選択しましょう。