はじめに
EC2にJekinsをインストールし、jenkinsのジョブを作成して実行するぞ! と意気込んでいたときのことです。
jenkinsのジョブの実行に失敗してしまいました。
私自身、jenkinsについてとても勉強になった出来事だったので、知っておくべきjenkinsの知識として残します。
事前準備
Jenkins用のEC2インスタンスを作成します。今回は、Amazon Linux 2で作成します。
EC2(Amazon Linux2)にJekinsをインストールする方法については以下記事を参考にしました。
今回、jenkinsで定型化するものは以下のようなジョブです。
・ EC2インスタンス起動・停止
・ 検証環境、staging、本番環境でのEC2インスタンスへのデプロイ
・ elasticsearchの全文検索インポート など
そのため、jenkinsからEC2への操作を可能にするためのポリシーをアタッチします。
EC2FullAccess
のポリシーをつけたIAMユーザーを作成し、認証情報
のタブからアクセスキーの作成
を行い、アクセスキーIDとシークレットパスワードをメモしておいてください
(※作成画面以降2度と表示されないのでCSVをダウンロードしておくことをオススメします)
その後、aws configure
コマンドで、jenkinsインスタンスにアクセスキーの配置を行います。
(※ここに罠があるので注意)
# 認証情報を設定
$ aws configure
# 4つ聞かれるのでそれぞれ入力
1. アクセスキー
2. シークレットキー
3. region
4. output形式 => json
# この配下にAWS認証情報(アクセスキー等)がある
$ cd ~/.aws
$ ls -la
=> config, credentials
Jenkinsのジョブが失敗する
アクセスキーの設置が終わり、jenkinsのジョブを作成し実行したところ、エラーになりました。
jenkinsのコンソール出力を見ると以下のようなエラーメッセージが・・・
unable to locate credentials. you can configure credentials by running "aws configure".
AWSの認証情報が設定されていないので、aws configure
を実行してください だと!!
おいおい、アクセスキーはさっきちゃんと配置したはずだぞ🤔
設定を確認してもきちんと登録されているはず、、、と思い見てみると、、やはり設定されている。。。
# アクセスキー設定情報を確認
$ 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ユーザーに設定していました)
一連の流れを確認すると・・・
# 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ユーザーの以下に格納されているので、確認できます。
# jenkinstユーザーになる
$ sudo su - jenkins
$ ls -la
=> ~~, jobs, users, logs, ~~
$ cd jobs
$ ls -la
=> 作成したジョブ一覧
# usersにはjekins上のuser一覧、logsにはジョブの実行ログが入っている
こうしてサーバ内に入り、いろいろ見てみると改めて、ソフトウェアがサーバ上で実行されているんだという実感が持ててとても勉強になりました。
以上、jenkins導入後知っておきたい初期知識でした。
参考
-
Jenkins
-
AWS Configure