AWS-CLIでパラメータとしてuser-dataを指定してOS設定を簡単にする方法 (ssm-agentインストールを例に)

はじめに

user-dataのファイルを用意することで、
起動時にOSの設定をしたり、エージェントのインストールをしたりすることができます、
このuser-dataはコンソールだけでなくAWS-CLIでも指定可能です。

そこで今回は、AWS-CLIでEC2インスタンスを起動させつつ、
同時にuser-dataを利用してssm-agentのインストールを行いたいと思います。
これにより、CLIで簡単に検証環境を構築して接続することができるようになります。

では早速始めましょう。

検証

user-dataの作成

user-dataを作成します。
ssm-agentのインストール方法は公式に載っていますのでそれをコピペします。
ただし、user-dataで実行する場合「シェバン」は忘れなきよう!
※以下はRHEL7の場合です。お使いのディストリビューションやバージョンによってコマンドが変わりますのでAWS公式をご参照ください。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/agent-install-rhel.html

file名:ssm_install.txt(任意)

#!/bin/bash

yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent

windows-userの皆さんは文字コードをUTF-8に変えて保存しましょう。

サクラエディタの場合は以下のようにすることで文字コードを変更できます。
file
file
file
ctrl+sで保存も忘れずに。

user-dataのアップロード

user-dataが作成できたのでCloudShell上にアップロードします。
CloudShellには予めAWS-CLIがインストールされており、簡単に始めることができるのでおすすめです。
CloudShellの起動(画面下部左側にCloudShellのボタンがあるのでクリックするだけです)
file

CloudShellのターミナル右上からローカルのファイルをアップロードできます。
file

アップロードできたかCloudShell上のターミナルで確認してみましょう。
cloudshell-userのhomeディレクトリにアップロードしたファイルがあります。

[cloudshell-user@ip-10-134-31-35 ~]$ pwd
/home/cloudshell-user
[cloudshell-user@ip-10-134-31-35 ~]$ 
[cloudshell-user@ip-10-134-31-35 ~]$ ls -lrt
total 4
-rw-r--r--. 1 cloudshell-user cloudshell-user 194 Dec 16 20:37 ssm_install.txt

CLI コマンドラインの作成 / 実行

次にAWS-CLIのコマンドラインを作成します。
CLIでパラメータを指定する際、コマンドラインに直接書く方法と、ファイルを指定する方法、またその両方を混在させる方法があります。
今回は、user-dataのみファイルを指定し、その他はコマンドライン上で直接パラメータを指定したいと思います。
ファイルを指定する際のポイントは、ファイルのプレフィックスに必ず’file://’ をつけることです。

以下はコマンドラインの一例です。
※ 詳細はAWS公式をご参照ください。
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html

aws ec2 run-instances \
    --tag-specification "ResourceType=instance,Tags={Key=Name,Value=Tom-sever-1}" \
    --image-id "${ami_id}" \
    --iam-instance-profile Name="${role_name}" \
    --instance-type t2.micro \
    --count 1 \
    --subnet-id "${subnet_id}" \
    --security-group-ids "${sg_name}" \
    --user-data file://ssm_install.txt \
    --output table

実行すると、EC2が起動しますのであとはssm接続するだけですね。

※ssm接続する際、agentのインストールだけでなくIAMロールに[AmazonSSMManagedInstanceCore]ポリシーが必要だったり、ネットワーク要件(インターネットへのアウトバウンド通信ないしはVPCエンドポイントを利用したSSMとの通信)が必要だったりしますのでご注意ください。

余談 IMDSでuser-dataを確認

実行したuser-dataはインスタンスメタデータサービスから取得して確認することもできます。
(以下はIMDSv1で実行した場合)

[root@ip-10-0-2-87 ~]# curl http://169.254.169.254/latest/user-data
#!/bin/bash

yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent[

参考:
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-add-user-data.html

おわりに

いかがだったでしょうか。
この記事では書けませんでしたが、user-dataを利用すればCloudWatch-agentのインストールや設定のインポート、EBSの追加ボリュームの構成なども起動と同時に行うことができます。
こうしたuser-dataとCLIとを組み合わせることで、迅速な基盤環境のデプロイが可能となり、構築時のオペレーションの作業負担を大幅に軽減することができるのではないかと考えています。
また、AWS CLIなら、CFnやterraformなどのIaCと比べて運用での特別の考慮なども不要のため利用の導入のハードルもかなり低いと思います。
サーバー構築手段の有力な選択肢の一つとして検討してみるのもありなのではないでしょうか。

それではまたお会いしましょう。
あでゅー!

Last modified: 2023-12-24

Author