EC2起動時にパラメータストアからtoken取得してgit cloneしてみた

EC2インスタンス作成時に、githubのプライベートリポジトリからcloneしておく、というのをやりたく、
無事にできたので手順をメモ。

## やりたいこと
- EC2インスタンス作成時に特定のgitリポジトリをcloneしたい
- EC2のユーザデータにgit clone を記載しておく
- gitのtoken はパラメータストアで管理する

## ざっくり構成図
![スクリーンショット 2023-12-09 11.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/85cc2f14-0ec7-c91e-b3eb-6c29fc7d2854.png)

## ParameterStoreの設定
![スクリーンショット 2023-12-09 11.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/64333a7a-eb98-db10-01d9-9415c0411f23.png)

- 名前は `/git/token` としました
- 機密データなので種類は SecureString (安全な文字列)としています
- 作成時のKMSはデフォルトを使用しました

## IAMの設定
EC2インスタンスが、パラメータストアから値を取得できるよう、IAMの設定を行います。
パラメータストアから getParameters できるポリシーを作成し、ロールに付与します。
そのロールをEC2インスタンスに設定します。

### IAMポリシーの作成
```json:Demo_SSM_GetParametes
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters",
                "ssm:GetParameter"
            ],
            "Resource": "arn:aws:ssm:ap-northeast-1:************:parameter/git/token"
        }
    ]
}
```

### IAMロールの作成
- 名前は `Demo_SSM_getParameters_Role` としました
- サービス/ユースケースは `EC2` を指定
- 許可ポリシーは先ほど作成した `Demo_SSM_GetParametes` を指定

![スクリーンショット 2023-12-09 11.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/3f6f98a6-3b3f-7f28-49d9-60d98f470723.png)

![スクリーンショット 2023-12-09 11.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/ccfe88c3-b30f-acdb-5668-6bbfec250283.png)

## EC2インスタンスから取得できることの確認
### IAMロールの設定
- 動作確認のため予め起動してあった適当なEC2インスタンスにIAMロール付与します

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333538363537372f36373063393438652d663633642d373139312d656464362d3666343239353263383131312e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/85b12d8e-7123-71b5-e831-d7401390b84b.png)


![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333538363537372f30646263306235322d653736322d393164302d383130312d3034643336646536343130652e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/c1ffda60-3147-4f4b-9f81-0269f737ca62.png)



### CLIで取得
IAMロールを付与したEC2インスタンスにSSH接続し、以下のコマンドを実行。

```bash
[ec2-user@ip-172-31-43-85 conf]$ aws ssm get-parameters --region ap-northeast-1  --names /git/token --with-decryption --query "Parameters[0].Value" --output text
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[ec2-user@ip-172-31-43-85 conf]$ 
```
- `XXXX・・・` と伏字にしていますが無事に取得できました。
- `--with-decryption` : 複合化して取得するようにしています。今回はKMSの設定をデフォルトのままとしているのであまり意識しませんでしたが、自前のキーを使うことで許可設定も増えるかもしれません。

## EC2起動テンプレートの作成
### IAMロールの設定
![スクリーンショット 2023-12-09 11.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586577/95a5295c-7ae4-6d3b-192f-ddfda4ca1529.png)
- `Demo_SSM_getParameters_Role` を設定

### ユーザデータの作成
```bash:ユーザーデータ
#!/bin/bash
yum update
yum install -y git
git clone  https://XXXXXXXXXX:`aws ssm get-parameters --region ap-northeast-1  --names /git/token --with-decryption --query "Parameters[0].Value" --output text`@github.com/XXXXXXXXXXXXXXXXX.git /home/ec2-user/XXXXX
```
- 細かいですが、1秒めの `#!/bin/bash` 書き忘れててなかなかうまく動きませんでした。
- これで無事に、EC2インスタンス作成時に、パラメータストアからtokenを取得してgit cloneする、ということが実現できました。