NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

新人がEC2の起動時セットアップで詰まった点

https://cdn-ak.f.st-hatena.com/images/fotolife/m/m2-yokota/20231207/20231207123830.png

はじめに

はじめまして。新人の横田です。 部署配属されて4か月ほど経ちます。主にAWSでの基盤構築やLinuxシステムのアーキテクチャについて一から学んでいます。

今回は、EC2の起動時セットアップを行った際に、再起動を行うと起動時セットアップした内容がリセットされるということがあったので、その解消方法を書いていこうと思います。

詰まった点

作業当初、設定変更のスクリプトをユーザーデータ内に書いてEC2インスタンスを作成していたのですが、SELinuxや言語設定を変更すると再起動を行うと設定が元に戻るということが発生しました。 具体的には、下図の黒枠の部分にスクリプトを書いていくイメージです。

解消方法

調べてみると、シェルスクリプトで記述していることと一時的な変更を行うコマンドを使用していたことが原因だと分かりました。 今回は、この状況で設定が戻ることの1つの解消方法として、cloud-initを使用してOSブート毎に任意のスクリプトを実行することで再起動後も同じ設定を維持することを実現しました。 cloud-initの使い方については以下のサイトを参考にしました。

cloudinit.readthedocs.io access.redhat.com

詰まった点を解消するにあたり、今回注目したシェルスクリプトとcloud-initの違いは、スクリプトの実行タイミングについてです。 シェルスクリプトはインスタンス初回起動時に1度実行されるのに対し、cloud-initを使えばOSブート毎にスクリプトを実行することが出来ます。

スクリプト確認

上記で話したシェルスクリプトとcloud-initの実行例について図を載せて話していきます。

まずは、駄目だった例として、シェルスクリプトを使用した際のスクリプトを図に示します。

シェルスクリプトは、1行目に #!/bin/bash を書いて任意のスクリプトを実行することが出来ます。 また、2行目の setenforce 0 は、SELinuxの設定を一時的に変更するコマンドです。 シェルスクリプトはインスタンス初回起動時のみスクリプトを実行するので、OSの再起動をかけると一時的に変更されていたSELinuxの設定が元に戻ってしまいます。

次に良かった例として、cloud-initを使用した際のスクリプトを図に示します。

cloud-initでは1行目に #cloud-config を書き、2行目以降にモジュールを使用して記述していきます。 setenforce 0 を記述していることはシェルスクリプトと同じですね。 今回重要なのは、2行目にbootcmdモジュールを使用している点です。 bootcmdモジュールは、cloud-initで使用されるモジュールの1つです。 bootcmdの中に書いた任意のスクリプトはOSブート毎に実行されるため、今回は、bootcmdモジュールの中に setenforce 0 を記述しました。 こうすることで、OSの再起動をかけた場合でもスクリプトが実行されて、設定が元に戻ることを防ぐことが出来ます。 つまり、SELinuxの設定は常に0(permissive)の状態になります。

おわりに

今回詰まったことで、cloud-initに対する知識が深まったと思います。 少しずつ理解していきたいですね。

Linuxの勉強においてSadServersというサイトもとても勉強になりました。 シナリオを元にLinuxサーバーで発生する様々な問題に対してトラブルシューティングの練習を行うことが出来るサイトなのでコマンドを覚えたい方やトラブル対応に強くなりたい方に是非おすすめです。

執筆者:横田 真斗
新人システムエンジニア