CircleCIだとSSHを使用してビルド コンテナにアクセスできますが
CodeBuildも 2020年07月からSessionManagerを使って中に入れるようになっていたので使ってみました。
https://aws.amazon.com/jp/about-aws/whats-new/2020/07/aws-codebuild-now-supports-accessing-build-environments-with-aws-session-manager/
普段ビルドプロジェクトのソースはCodePipelineにしているため、デバッグ用に個別実行する時はソースをS3変更する必要がありました。(後述)
やりかた
公式ドキュメント に書いてある通りですが。
1. BuildProjectのサービスロールに権限を追加
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
2. ビルド一時停止するコマンド(codebuild-breakpoint)をbuildspecに追加しておく
phases:
build:
commands:
- codebuild-breakpoint ←追加
- python -m unittest discover tests
3. 「Enable session connection」にチェックを入れて実行
(オプション)ソースの変更
例えば普段はCodePipelineをソースにしているプロジェクトで、そのままマネコンから実行しようとするとエラーが出ます。
CodePipelineで直前に失敗したビルドのアーティファクトをS3ソースとして直接指定してやることで同じソースから実行できます。
4. codebuild-breakpointのところで止まるのでブラウザから入る
接続可能な状態になると Buils statusの右下に Session Manager へのリンクが出現するのでクリック
codebuild-breakpointで止めなくても現れますが、入ろうとしたらビルドが進んで終わっちゃったりしたので、止めて入るのがいいかなと思います。
5. おわったら「codebuild-resume」でビルドを再開して出る
ローカルで成功していたはずのunittestが失敗していましたが、中に入って調べたおかげで原因解明できました。やったー!
備考
普段CodePipelineからCodeBuildを実行しているんですが、その場合「Enable session connection」にチェックを入れる相当の設定が見つけられなかったので、CodeBuild単独で動かして中に入っています。
普段から「codebuild-breakpoint」をbuildspecに仕込んでおいて、デバッグが必要なときだけCodeBuildから「Enable session connection」有効にして実行する。という運用がいいんですかね。
※「Enable session connection」してない場合はcodebuild-breakpointおよび codebuild-resume コマンドは無視される仕様。