Jenkinsの罠 !? 知っておくべきJenkinsの知識

# はじめに
EC2にJekinsをインストールし、jenkinsのジョブを作成して実行するぞ！　と意気込んでいたときのことです。

jenkinsのジョブの実行に失敗してしまいました。

私自身、jenkinsについてとても勉強になった出来事だったので、知っておくべきjenkinsの知識として残します。


# 事前準備
Jenkins用のEC2インスタンスを作成します。今回は、**Amazon Linux 2**で作成します。

EC2(Amazon Linux2)にJekinsをインストールする方法については以下記事を参考にしました。

https://qiita.com/tamorieeeen/items/15d90adeebbf8b408c78

今回、jenkinsで定型化するものは以下のようなジョブです。
・ EC2インスタンス起動・停止
・ 検証環境、staging、本番環境でのEC2インスタンスへのデプロイ
・ elasticsearchの全文検索インポート　など

そのため、jenkinsからEC2への操作を可能にするためのポリシーをアタッチします。

`EC2FullAccess`のポリシーをつけたIAMユーザーを作成し、`認証情報`のタブから`アクセスキーの作成`を行い、アクセスキーIDとシークレットパスワードをメモしておいてください
（※作成画面以降2度と表示されないのでCSVをダウンロードしておくことをオススメします）

その後、`aws configure`コマンドで、jenkinsインスタンスにアクセスキーの配置を行います。
（※ここに罠があるので注意）

![スクリーンショット 2022-01-12 22.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/9d5a5f18-4bec-aa87-d806-96987f54cace.png)



```bash:jenkinsインスタンス
# 認証情報を設定
$ aws configure
# 4つ聞かれるのでそれぞれ入力
1. アクセスキー
2. シークレットキー
3. region
4. output形式　=> json

# この配下にAWS認証情報（アクセスキー等)がある
$ cd ~/.aws 
$ ls -la
=> config, credentials
```

# Jenkinsのジョブが失敗する
アクセスキーの設置が終わり、jenkinsのジョブを作成し実行したところ、エラーになりました。
jenkinsのコンソール出力を見ると以下のようなエラーメッセージが・・・


![スクリーンショット 2021-12-23 14.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/6caf5a68-dc0b-c0d9-b009-aa8fdffbf495.png)

```
unable to locate credentials. you can configure credentials by running "aws configure".
```
AWSの認証情報が設定されていないので、`aws configure`を実行してください だと！！

おいおい、アクセスキーはさっきちゃんと配置したはずだぞ🤔
設定を確認してもきちんと登録されているはず、、、と思い見てみると、、やはり設定されている。。。

```bash:jenkinsインスタンス 
# アクセスキー設定情報を確認
$ aws configure list

=> aws_access_key_id = *****************
=> aws_secret_access_key = *****************
```

# ここに罠があった
以下、私が知らなかった事実です。。。

まず、前提として、、、、
Jenkinsをインストールすると、jenkinsユーザーが作成され、EC2内の`/var/lib/jenkins`がjenkinsユーザーのホームディレクトリに設定されます。

そうなんです！jenkinsのジョブを実行しているのは、EC2の中のec2-userでもなければ、rootユーザーでもありません。jenkinsユーザーだったのです。

だからEC2内のjenkinsユーザーにAWSの認証情報（アクセスキー）を設定してあげる必要があったのです。
（お気づきだと思いますが、これまでは、ec2ユーザーとrootユーザーに設定していました）

一連の流れを確認すると・・・

```bash:jenkinsインスタンス 
# EC2内にjenkinsディレクトリが存在することを確認
$ cd /var/lib/jenkins
$ ls -a
=> ~~~ , jenkins, ~~

# jenkinsユーザーになる
$ sudo su - jenkins

# -bash-4.2$になると成功している
-bash-4.2$ pwd
=> /var/lib/jenkins

# ここで認証情報を確認すると・・・やはりなにも設定されていなかった😢
$ aws configure list
=> aws_access_key_id
=> aws_secret_access_key

# jenkinsユーザーに対して、認証情報を設定
$ aws configure 
```

無事、ジョブが成功しました！

**ジョブを実行しているのはjenkinsユーザーである**
どうかこれだけは忘れずに。


## 余談
画面上で作成したJenkinsのジョブはサーバ内jenkinsユーザーの以下に格納されているので、確認できます。

```bash:jenkinsインスタンス
# jenkinstユーザーになる
$ sudo su - jenkins
$ ls -la
=> ~~,  jobs, users, logs, ~~
$ cd jobs
$ ls -la
=> 作成したジョブ一覧

# usersにはjekins上のuser一覧、logsにはジョブの実行ログが入っている
```

こうしてサーバ内に入り、いろいろ見てみると改めて、ソフトウェアがサーバ上で実行されているんだという実感が持ててとても勉強になりました。

以上、jenkins導入後知っておきたい初期知識でした。

憎いおじさんに数時間捕まってしまいました、、、
![jenkins.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669969/4698166e-8e5b-56db-2a01-19d2efc562f5.png)


# 参考
- Jenkins
  - [Jenkinsをインストールしたにもかかわらず、sudo su - jenkins でjenkinsユーザーになれない場合の対処](https://www.utakata.work/entry/20180130/1517270400)

- AWS Configure
  - [AWS 設定ファイルと認証情報ファイルの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)