terraformでEC2のuser_dataを設定してみる

  • EC2
  • Terraform
  • やりたいこと

    今回の目的は以下です。

    • 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を使えば、色々なことができます。クラウドを使い倒すためには非常に便利ですね。

  • EC2
  • Terraform