AWS CodeBuildをデバックするならssm接続でやろう (セッションマネージャを利用しビルドコンテナへのログインする方法)

# 概要

* 以前、CodeBuildのデバックをしようとした際に、マネージドで立ち上がるビルドコンテナをどうやってデバックしようか迷ったことがありました。
* そんな時、セッションマネージャを利用したビルドコンテナにログインする機能が大変役にたったので、今回は方法について記事にしていきます。

## セッションマネージャを利用しAWS CodeBuildのビルドコンテナに接続

* まず初めに**セッションマネージャを利用しAWS CodeBuildのビルドコンテナに接続するにはいくつか条件があります。**
  * 利用するイメージにSSMエージェントがインストールされており、SSM エージェントのコンテナモードが有効になっていること
  * AWS CodeBuildのサービスロールにSSMのポリシーが追加されていること
  => ただこちらは、ビルドの開始時にこのポリシーをサービスロールに自動的にアタッチするように設定することができます。手動でアタッチする場合は、下記のようなポリシーをアタッチしましょう。

```json
{
  "Effect": "Allow",
  "Action": [
    "ssmmessages:CreateControlChannel",
    "ssmmessages:CreateDataChannel",
    "ssmmessages:OpenControlChannel",
    "ssmmessages:OpenDataChannel"
  ],
  "Resource": "*"
}
```

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/session-manager.html#ssm.prerequisites


**※ こちらの機能を利用する際に、注意点が２つあります。**

* **AWS CodeBuildはビルドを開始してから終了するまでの時間で課金が発生するため、デバック時に一時停止したビルドコンテナをそのままにするのはやめましょう(一応、AWS CodeBuild自体にタイムアウトの設定ができるので、タイムアウトで落ちるようにはなっています。)**
* **セッションマネージャの設定は複数作成できないので、既存でセッションマネージャを利用している場合Session Manager経由でログインした時のログが全て同一のS3のバケットの中に吐かれるようになります。また、その関係のSSMがログを吐くような設定をしていれば、上記のポリシーにS3へログを吐けるような権限を追加しないといけません。**


## やってみましょう

* 今回検証用に１つCodeBuildを作成しました。

![スクリーンショット 2022-06-28 13.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/a2bda37c-4297-795e-b1fd-b8cc1f6334da.png)

![スクリーンショット 2022-06-28 13.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/e3daf8f4-cba3-c897-410c-a18f6e67c4ce.png)

* BuildSpecは、下記のようにしています。
* **ここが重要なのですが、Buildspecにcodebuild-breakpointというコマンドを追加することで、追加したポイントでビルドを一時停止させることができます。でバックする際にどこにブレイクポイントを追加したいかによってBuildspecを更新しましょう。**

```yaml
version: 0.2

phases:
  pre_build:
    commands:
      - echo "Hello World"
      - codebuild-breakpoint
```

* また上記で説明したセッションマネージャ用のポリシーを追加しました。
* 今回は、S3へログは吐き出さないようにしています。
![スクリーンショット 2022-06-28 14.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/572aeef4-7106-4be8-f430-fe651fe912a0.png)


## 実行してみる

* 先ほど設定したブレイクポイントで一時停止し、セッションマネージャでログインするには実行時に「ビルドの実行」ではなく、「上書きでビルドを開始する」を選択します。

![スクリーンショット 2022-06-28 14.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/7bd1eec3-a347-95d1-20dd-af85c723a8a2.png)

* また、次の画面で「高度なビルドの上書き」を選択する必要があります。

![スクリーンショット 2022-06-28 14.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/1df25414-a86b-db43-d536-d2cc8eb6027f.png)

* 次に「セッション接続」のセクションで「セッション接続の有効化」にチェックします。
![スクリーンショット 2022-06-28 14.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/e5ed40ca-5a79-620d-0240-251c837ee3bf.png)

**設定は完了したので、ビルドを実行しましょう！**


### セッションマネージャによるビルドコンテナへのログイン

* ビルドの実行が始まると下記のように、設定したブレイクポイントまでいった時に、セッションマネージャへの接続するリンクが表示されるようになります。

![スクリーンショット 2022-06-28 14.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/33d4ddf6-75eb-60b6-038a-24084b8c2f83.png)

* 「AWS セッションマネージャ」を選択すると下記のようにビルドコンテナへ接続することができます。
* あとはデバックしたいことを実施するだけです。
* またセッションを切断したあとは、必ず「ビルドの停止」をしましょう。

![スクリーンショット 2022-06-28 14.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/c1027943-a39d-6e14-02aa-63650b0edcdc.png)


# まとめ

* AWS CodeBuildをデバックしようとした時に非常に便利な機能なので、ぜひご活用ください！

# 参考

https://aws.amazon.com/jp/about-aws/whats-new/2020/07/aws-codebuild-now-supports-accessing-build-environments-with-aws-session-manager/