CloudFormationのあれやこれや
概要
CloudFormationを書いている際に、これってどうなんだっけ?と思うことが時折発生していたので、今回は備忘録として小ネタ集的な感じでまとめておきます。
なお、こちらは随時更新予定です。
その1
EC2のuserdataを使用した際のログ
EC2のuserdataを使用すると初回起動時にインスタンスにuserdataに記述した内容を渡し、スクリプトの実行などを行うことができます。
その際の実行履歴はサーバログイン時には特に表示されることはないのですがこのログ、実は下記に保存されています。
1/var/log/cloud-init-output.log
また、userdataの内容は下記に保存されています。
1/var/lib/cloud/instance/scripts/part-001
もしくは
1/var/lib/cloud/instance/user-data.txt
検証
今回使用したuserdataは下記になります。
templete.yml1UserData: 2 Fn::Base64: !Sub | 3 #!/bin/bash 4 hostnamectl set-hostname ${InstanceHostName} 5 timedatectl set-timezone Asia/Tokyo 6 echo PS1=\"[\\u@\\h \\t \\W]\\$ \" >> /root/.bashrc 7 echo PS1=\"[\\u@\\h \\t \\W]\\$ \" >> /home/ec2-user/.bashrc 8 yum update -y 9 yum install mysql -y 10 echo "hogehoge" >> test.txt
cloud-init-output.logをlessすると下記のようにちゃんとログが出力されていることが分かります。
cloud-init-output.log1Cloud-init v. 19.3-46.amzn2 running 'init-local' at Fri, 16 Feb 2024 14:02:55 +0000. Up 5.30 seconds. 2Cloud-init v. 19.3-46.amzn2 running 'init' at Fri, 16 Feb 2024 14:02:56 +0000. Up 6.39 seconds. 3ci-info: ++++++++++++++++++++++++++++++++++++++Net device info+++++++++++++++++++++++++++++++++++++++ 4ci-info: +--------+------+-----------------------------+---------------+--------+-------------------+ 5ci-info: | Device | Up | Address | Mask | Scope | Hw-Address | 6ci-info: +--------+------+-----------------------------+---------------+--------+-------------------+ 7 8 9~ 長いので中略 ~ 10 11 12Loaded plugins: extras_suggestions, langpacks, priorities, update-motd 13Resolving Dependencies 14--> Running transaction check 15---> Package mariadb.x86_64 1:5.5.68-1.amzn2.0.1 will be installed 16--> Finished Dependency Resolution 17 18Dependencies Resolved 19 20================================================================================ 21 Package Arch Version Repository Size 22================================================================================ 23Installing: 24 mariadb x86_64 1:5.5.68-1.amzn2.0.1 amzn2-core 8.8 M 25 26Transaction Summary 27================================================================================ 28Install 1 Package 29 30Total download size: 8.8 M 31Installed size: 49 M 32Downloading packages: 33Running transaction check 34Running transaction test 35Transaction test succeeded 36Running transaction 37 Installing : 1:mariadb-5.5.68-1.amzn2.0.1.x86_64 1/1 38 Verifying : 1:mariadb-5.5.68-1.amzn2.0.1.x86_64 1/1 39 40Installed: 41 mariadb.x86_64 1:5.5.68-1.amzn2.0.1 42 43Complete! 44Cloud-init v. 19.3-46.amzn2 finished at Fri, 16 Feb 2024 14:04:36 +0000. Datasource DataSourceEc2. Up 106.18 seconds
また、/var/lib/cloud/instance/scripts/part-001
にuserdataの内容もちゃんと記載されていました。
/var/lib/cloud/instance/scripts/part-0011[root@cfn-instance 23:47:58 scripts]$ cat part-001 2#!/bin/bash 3hostnamectl set-hostname cfn-instance 4timedatectl set-timezone Asia/Tokyo 5echo PS1=\"[\\u@\\h \\t \\W]\\$ \" >> /root/.bashrc 6echo PS1=\"[\\u@\\h \\t \\W]\\$ \" >> /home/ec2-user/.bashrc 7yum update -y 8yum install mysql -y 9echo "hogehoge" >> test.txt
その2
EC2のuserdataの実行権限と実行ディレクトリ
userdataの実行権限が分からずsudo
を付けるべきなのか分からなくなったことありませんか?
実はuserdataの実行権限はrootなのでsudoは不要です(実際上記の検証ではsudoなしで問題なく実行されています)。
また、実行ディレクトリは/
です。
1[root@cfn-instance 01:03:18 /]$ cat /test.txt 2hogehoge
その3
VPCを記載しないとき
テンプレートにVPCを記載しなかった状態でEC2などを記載したとき、エラーにはならずデフォルトVPCに配置されます。
その4
セキュリティグループのFromPortとToPortの違い
セキュリティグループのFromPortとToPortはよく同じ値にされていることを目にすると思いますが、この違いについてです。
1SecurityGroupIngress: 2 - IpProtocol: tcp 3 CidrIp: !Sub ${SSHAllowIPAddress}/32 4 FromPort: "22" 5 ToPort: "22"
Fromが範囲の初め、Toが終わりを指しており、これらを違う値にすることでポート範囲を指定することができます。
つまり同じ値していたのは1つのポートのみ指定したかった、ということですね。
その5
Systems Manager パラメータストアに保存している値の参照
テンプレートを作成していて同時にRDSやらIAMユーザやらのパスワードを設定したい時があると思います。
ただパスワードをテンプレートへハードコーディングはあまりにも都合が悪すぎるので、SSMパラメータストアを利用する際の方法についてです。
記述はパラメータストアに保存している値がString・String List型かSecure String型かで微妙に記述方法が異なります。
String・String List型の場合1"{{resolve:ssm:${パラメータ名}:${パラメータバージョン値}}}"
Secure String型の場合1"{{resolve:ssm-secure:${パラメータ名}:${パラメータバージョン値}}}"
見ずらいからといって勝手にスぺ―スなどを入れてしまうと正常に動作しなくなるため入れてはいけません。なお、Sub関数などとは組み合わせて使用することは可能です。
Secure String型の方が安全性は高いものの、どの部分にでも使用できるわけではなく、使用範囲はIAMパスワードやRDSパスワードなど、ある程度限られています。
詳細は下記の公式リファレンスをご参照ください。