terraformでEC2のuser_dataを設定してみる
やりたいこと
今回の目的は以下です。
- terraformを使います。
- 使わないときはEC2(AmazonLinux2)を削除して、使いたい時に作り直す。
- でも、以前インストールしていたパッケージは引き継ぎたい。
- さらに、設定情報(日本語設定、日本時間設定)も引き継ぎたい。
こんなとき、terraformとEC2のuser_dataを利用すると便利です。AmazonLinux2、WindowsServer2019でそれぞれで試してみたいと思います。
やりたいと思った経緯
IT系の会社では、検証用・勉強用にAWSアカウントの貸し出しを行なっている企業は多いかと思います。
ただ、当然ながらリソースに費やされる課金は無料ではなく、普通に会社に請求されます。
たまにこんな連絡がこないでしょうか?
「先月、社内用AWSアカウントの請求金額が○○万円でした。お前ら、ちょっと使いすぎていますね。使わないリソースは停止するか、削除するかしてください。」
身に覚えのある方は多いのではないかなと思います。
やってみる
方法は単純で、terraformでEC2(AmazonLinux2)を構築する際に、user_dataを指定します。
私は最近、データベース関連の仕事が多いので、作成するEC2(AmazonLinux2)には、データベースへ接続するためのコマンドラインツールが必須です。
その都度インストールするのは面倒ですので、EC2(AmazonLinux2)構築時に、それらを自動でインストールする設定をuser_dataで入れています。
user_dataで投入するEC2の設定
以下の設定をuser_dataで入れたいと思います。
- mysql
- psql
- 日本語、日本時間の設定
ec2.tf(サンプルコード)
# EC2
resource "aws_instance" "ec2_amzn2" {
# 基本設定
ami = data.aws_ssm_parameter.amzn2_ami.value
instance_type = "t2.micro"
key_name = aws_key_pair.key_pair.key_name
vpc_security_group_ids = [aws_security_group.ec2.id]
subnet_id = aws_subnet.ec2.id
root_block_device {
volume_type = "gp2"
volume_size = 30
}
associate_public_ip_address = true
iam_instance_profile = aws_iam_instance_profile.ec2.name
user_data = <<EOF
#!/bin/bash
yum update -y
### mysql
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum install -y yum-utils
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
yum install -y mysql-community-client
### psql
rpm -ivh --nodeps https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sed -i "s/\$releasever/7/g" "/etc/yum.repos.d/pgdg-redhat-all.repo"
yum install -y postgresql12
### JST
sed -ie 's/ZONE=\"UTC\"/ZONE=\"Asia\/Tokyo\"/g' /etc/sysconfig/clock
sed -ie 's/UTC=true/UTC=false/g' /etc/sysconfig/clock
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
### locale
sed -ie 's/en_US\.UTF-8/ja_JP\.UTF-8/g' /etc/sysconfig/i18n
EOF
}
このように最初にrootユーザーでやっておきたいことを書いておくと、ec2を新規作成した状態でも、必要なパッケージがインストール済みです。
ご参考
ちなみに、AWSの提供する最新のamiは以下の方法で取得できます。
# amazonlinux2 の最新amiを自動的に取得します。
data "aws_ssm_parameter" "amzn2_ami" {
name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
}
Windows版 user_data(powershell)
では、今度はWindowsでuser_dataの指定方法を記載します。
# EC2
resource "aws_instance" "ec2_win2019" {
ami = data.aws_ami.win2019_ami.id
instance_type = "t3.2xlarge"
key_name = aws_key_pair.key_pair.key_name
vpc_security_group_ids = [
aws_security_group.ec2.id
]
subnet_id = aws_subnet.ec2.id
root_block_device {
volume_type = "gp2"
volume_size = "30"
}
associate_public_ip_address = true
iam_instance_profile = aws_iam_instance_profile.ec2.name
# 初期設定
user_data = <<EOF
New-LocalUser -Name ${var.user} -Password (ConvertTo-SecureString "${var.user_password}" -AsPlainText -Force) -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member win2019
New-Item "C:\applications" -ItemType "directory"
Read-S3Object -BucketName aws-aqua-terraform -Prefix koizumi/windows -Folder "C:\applications"
Set-TimeZone -Id "Tokyo Standard Time"
EOF
}
上記のuser_dataで何をしているか
以下のことを行なっています。- ユーザー名:user、パスワード:user_password、のユーザーを作成
- 上記のユーザーをAdministratorsグループに追加
- ディレクトリ(C:\applications)を作成
- 上記のディレクトリにS3からファイル(各種インストールexe)をダウンロード
- TimeZoneを日本時間に設定
ここまでやっておけば、WindowsServer を構築してすぐに、任意のユーザー名・任意のパスワードで、Administrator権限でログインすることができます。
WindowsServerはいちいちパスワードを手動で発行してからログインしなければいけないという面倒なところがありましたが、これで解決です。
さらに、インストールexeも配布済みとあれば、すぐに作業が始められます。
最後に
いかがでしたでしょうか。user_dataを使えば、色々なことができます。クラウドを使い倒すためには非常に便利ですね。