エンジニアになった元数学教師の記録

CloudFormationのあれやこれや

February 17, 2024 02:24
February 19, 2024 00:59

概要

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.yml
1UserData:
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.log
1Cloud-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-001
1[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パスワードなど、ある程度限られています。

詳細は下記の公式リファレンスをご参照ください。