EC2にRundeckを構築する

# 概要
EC2にRundeckの構築を行なったので、記録も兼ねて構築方法について記録する
※目的はRundeckの画面が表示されてログインできるところまでのため、セキュリティ面は一旦省略（アクセス制限などは除外）

# 準備

## SSMのロール作成
SSMでEC2インスタンスにログインするときに必要なポリシーを指定し、ロールを作成しておく
* ポリシー名：AmazonSSMManagedInstanceCore

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html

ちょうど[ハンズオン](https://catalog.us-east-1.prod.workshops.aws/workshops/7e60f6e3-0c8f-488a-bedc-632aa8d526ea/ja-JP/phase2/01)に設定方法があった

# 手順

## EC2インスタンス作成
EC2サービスから`インスタンスを起動`を選択

* 名前とタグ：任意
* アプリケーションおよび OS イメージ ：Amazon Linuxを指定
* インスタンスタイプ：t3.medium
* キーペア：用意して指定
* ネットワーク設定
    * ファイアウォール (セキュリティグループ)
        * セキュリティグループを作成する
    * 以下をチェック
        * SSH トラフィックを許可する
        * インターネットからの HTTPS トラフィックを許可
        * インターネットからの HTTP トラフィックを許可
* ストレージを設定
    * 8GB
* 高度な詳細
    * IAM インスタンスプロフィール
        * 準備で作成したIAMロールを指定

を指定し、`インスタンスを起動`を押してECインスタンスを作成する

### memo
インスタンスタイプは、Rundeckのページに記載があったのでそのまま指定してみた
https://docs.rundeck.digitalstacks.net/l/ja/installation/system-requirements

## Rundeckの構築

### EC2のセッションマネージャでSSHアクセス
作成したEC2インスタンスをチェックし、`接続`を押す
セッションマネージャータブから`接続`を押す


### Rundeckのインストール

Rundeckのページにインストール方法があったので、なぞる
https://docs.rundeck.digitalstacks.net/l/ja/installation/linux-rpm


* Rundeck yumリポジトリを追加

```
curl https://raw.githubusercontent.com/rundeck/packaging/main/scripts/rpm-setup.sh 2> /dev/null | sudo bash -s rundeck
```

* エントリの追加 (/etc/yum.repos.d/rundeck.repo)
追加前に確認したら、すでに存在していたのでスキップする

```
cat /etc/yum.repos.d/rundeck.repo

# 結果
[rundeck]
name=rundeck
baseurl=https://packages.rundeck.com/pagerduty/rundeck/rpm_any/rpm_any/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packages.rundeck.com/pagerduty/rundeck/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
```

* rpmパッケージをインストール

https://www.rundeck.com/downloads
Sign upをしないとだったので、yumを使ってインストールに変えてみる


* yumでインストール

```
sudo yum install rundeck java
```

### Rundeck開始

```
$ sudo service rundeckd start
Starting rundeckd (via systemctl):                         [  OK  ]
``` 

少し時間がかかるので、Logで状況確認(`/var/log/rundeck/service.log`)

`Grails application running・・・`と表示されたら開始

```
tail -f /var/log/rundeck/service.log

# 結果
[2022-12-31T22:10:17,328] INFO  rundeckapp.BootStrap - Starting Rundeck 4.8.0-20221110 (2022-11-10) ...
[2022-12-31T22:10:17,335] INFO  rundeckapp.BootStrap - using rdeck.base config property: /var/lib/rundeck
[2022-12-31T22:10:17,358] INFO  rundeckapp.BootStrap - loaded configuration: /etc/rundeck/framework.properties
[2022-12-31T22:10:17,520] INFO  rundeckapp.BootStrap - RSS feeds disabled
[2022-12-31T22:10:17,521] INFO  rundeckapp.BootStrap - Using jaas authentication
[2022-12-31T22:10:17,534] INFO  rundeckapp.BootStrap - Preauthentication is disabled
[2022-12-31T22:10:17,639] INFO  rundeckapp.BootStrap - Rundeck is ACTIVE: executions can be run.
[2022-12-31T22:10:18,084] WARN  rundeckapp.BootStrap - [Development Mode] Usage of H2 database is recommended only for development and testing
[2022-12-31T22:10:18,214] INFO  rundeckapp.BootStrap - workflowConfigFix973: applying...
[2022-12-31T22:10:18,249] INFO  rundeckapp.BootStrap - workflowConfigFix973: No fix was needed. Storing fix application state.
[2022-12-31T22:10:18,761] INFO  rundeckapp.BootStrap - Rundeck startup finished in 1593ms
[2022-12-31T22:10:18,803] INFO  rundeckapp.Application - Started Application in 66.737 seconds (JVM running for 75.838)
Grails application running at http://localhost:4440 in environment: production
```

ステータス確認で開始されたことを確認

```
sudo service rundeckd status

# 結果
● rundeckd.service - SYSV: rundeckd, providing rundeckd
   Loaded: loaded (/etc/rc.d/init.d/rundeckd; bad; vendor preset: disabled)
   Active: active (running) since Sat 2022-12-31 22:09:02 UTC; 2min 44s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2910 ExecStart=/etc/rc.d/init.d/rundeckd start (code=exited, status=0/SUCCESS)
 Main PID: 2918 (runuser)
   CGroup: /system.slice/rundeckd.service
           ‣ 2918 runuser -s /bin/bash -l rundeck -c java -Drundeck.jaaslogin=true            -Djava.security.auth.login.config=/etc/rundeck/jaas-loginmodule...

Dec 31 22:09:02 ip-172-31-34-126.ap-northeast-1.compute.internal systemd[1]: Starting SYSV: rundeckd, providing rundeckd...
Dec 31 22:09:02 ip-172-31-34-126.ap-northeast-1.compute.internal rundeckd[2910]: Starting rundeckd: [  OK  ]
Dec 31 22:09:02 ip-172-31-34-126.ap-northeast-1.compute.internal systemd[1]: Started SYSV: rundeckd, providing rundeckd.
```


curlでレスポンス確認し、200とログイン画面の記録がターミナルに表示されているのを確認する

```
curl -v localhost:4440/user/login
```

### ブラウザからRundeckへのアクセス
以下の設定が必要
* Rundeck側でURL指定
* EC2セキュリティグループのインバウンド設定でport 4440を許可させる

#### RundeckのURL設定

```
$ sudo vi /etc/rundeck/rundeck-config.properties

以下を書き換え

grails.serverURL=http://localhost:4440
↓
grails.serverURL=http://{EC2のIPアドレス}:4440
```
####  セキュリティグループでインバウンド指定

インスタンス→セキュリティグループ→インバウンドの編集
rundeckのポート番号4440を許可をして`ルールを保存`を押す

* タイプ：`カスタムTCP`
* プロトコル：`TCP`
* ポート範囲：`4440`
* ソース：`カスタム`
    * IP：`0.0.0.0/0`


### ログイン画面接続

http://{EC2のIPアドレス}:4440にアクセス

![スクリーンショット 2023-01-01 2.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248644/cb6dd8b9-2375-dc7e-322c-ce8fcafb960d.png)

初期は、`admin`のため、それぞれ入力してアクセス

ログイン後の画面に遷移しなかったのでconsoleを見ると以下のエラー

```
Refused to send form data to 'http://{IPアドレス}:4440/j_security_check' because it violates the following Content Security Policy directive: "form-action 'self'".
```

https://github.com/rundeck/rundeck/issues/4417
上の記事より、form-action ディレクティブを変更して、URL を有効にしてみる


```
$ sudo vi /etc/rundeck/rundeck-config.properties

以下を追加

rundeck.security.httpHeaders.provider.csp.config.form-action=self http://{IPアドレス}:4440
```


rundeckをrestartさせる

```
sudo service rundeckd restart
Restarting rundeckd (via systemctl):                       [  OK  ]
```

再度アクセスし、ログインをしてみる

![スクリーンショット 2023-01-01 7.26.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248644/93eea132-76fa-f2d9-5fc5-62ccfb47498d.png)


メニューが表示され、ログインまでできたので、一旦構築は完了とする

## 参考

https://kinokuniya.hatenablog.com/entry/2019/10/16/113517