構築目的と背景
お断り:目新しい情報はないかと思います。
業務でCloudFormationを活用するようになりました。
その中で単にEC2を作成した場合、作成後の手作業が多く自動化のありがたみが薄いと感じました。
そこでcfn-init ヘルパースクリプトを活用したいと思います。
※AmazonLinux2では上記のヘルパースクリプトが標準でインストールされている為、前準備は不要です。
できること
- コマンドの実行
- ファイル作成
- ユーザー/グループの作成
- パッケージのインストール
- サービスの起動設定
- ソース(アーカイブファイルをダウンロード)
活用内容
私が活用したのはパッケージのインストールとコマンドの実行です。
パッケージ
- yumでインストールが可能なものはパッケージ名を記載
- バージョンに関しては[]であればOSがインストールできる最新版がインストールされます。
- 指定のバージョンがあればリストの書式で記載してください。
- 更に新しいバージョンを指定したい場合はrpmにURLを記載することでインストールが可能となります。
EC2:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Init:
config:
packages:
rpm:
mysql80-community-release: https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum:
python3: []
mysql-community-client: []
git:
- "2.20.1"
コマンド
Amazon Linux2であればamazon-linux-extrasを使ってインストールすることもありますし、
Pythonであればpip installもあります。他にもyum以外の手段はあるかと思います。
それらは上記パッケージのインストールでは対応できない(と思ってます)のでコマンドにて対応します。
また、名前のアルファベット順にコマンドが実行される為、順番に考慮が必要な場合は
コマンド名に数字を付けておくと良いです。
EC2:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Init:
config:
commands:
01php73:
command: "amazon-linux-extras install php7.3"
02pytest:
command: "pip3 install pytest"
03mount:
command: "mkdir -p /home/storage"
04mount:
command: "echo \"xxx.xxx.xxx.xxx:/storage /home/storage nfs nolock,hard 0 0\" >> /etc/fstab"
05mount:
command: "mount -a"
適用方法
上記をCloudFormationのテンプレートに記載しただけでは適用されません。
UserDataへcfn-init ヘルパースクリプトを実行する手順の記載が必要です。
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum -y update
/opt/aws/bin/cfn-init --stack ${AWS::StackName} --resource EC2 --region ${AWS::Region}
まとめ
上記を駆使すると工数が削減でき、手作業よりも結果にブレがなく良いのではないでしょうか。
余談
ユーザー作成ですがuidが選ぶことが可能ですが、強制で/sbin/nologinとして作成する為、用途が限定されてしまいます。
コマンドにて対応するとCloudFormationのテンプレートにパスワードが記載されてしまうので、ユーザー作成は別途検討が必要だと感じました。