Amazon Linux 2用 AWS Systems ManagerでOSの簡易設定ドキュメントを作ってみた

AWS Systems ManagerでAmazon Linux2を簡易設定するドキュメントを作成してみた
2018.04.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おはようございます、加藤です。AWS Systems Manager(以降、SSM)でAmazon Linux2を簡易設定するドキュメントを作ったので公開します。

できること

簡易設定という言葉だけでは何ができるかわからないので説明します。今回作成したドキュメントをAmazon Linux2に対して以下の処理を実行できます。

  • ホスト名変更
  • YUMアップデート
    • セキュリティアップデートのみも可能
  • タイムゾーン変更
  • 言語設定変更

SSMを使って処理を行うので、アウトバウンド通信許可 or SSMへのVPCエンドポイントがあればSSHで端末に接続せずにこれらの作業が行なえます。

作ったドキュメント

ドキュメントは下記のリンクを参考にYAML形式で作成しました。

SSM ドキュメントの構文 - AWS Systems Manager

User-AmazonLinux2-SetupScript.yml

---
schemaVersion: '2.2'
description: Software Inventory Policy Document.
parameters:
  hostname:
    type: String
    default: ""
    description: "(任意) ホスト名を入力してください。入力がない場合は現在のホスト名が維持されます。"
  update:
    type: String
    default: "none"
    description: "YUMアップデートの動作を選択してください。"
    allowedValues:
    - all
    - security
    - none
  timezone:
    type: String
    description: "タイムゾーンを入力してください。"
    default: "Asia/Tokyo"
  language:
    type: String
    description: "ターミナルの言語を入力してください。"
    default: "ja_JP.UTF-8"
mainSteps:
  - action: aws:runShellScript
    name: hostname
    inputs:
      runCommand:
      - if [[ -n "{{ hostname }}" ]]; then hostnamectl set-hostname {{hostname}} ; fi
  - action: aws:runShellScript
    name: update
    inputs:
      runCommand:
      - if [[ {{ update }} == "all" ]]; then yum -y update ; fi
      - if [[ {{ update }} == "security" ]]; then yum --security -y update ; fi
      - if [[ {{ update }} == "none" ]]; then echo "Did not update" ; fi
  - action: aws:runShellScript
    name: timezone
    inputs:
      runCommand:
      - timedatectl set-timezone {{ timezone }}
      - echo "Time zone changed to {{ timezone }}"
  - action: aws:runShellScript
    name: language
    inputs:
      runCommand:
      - echo "LANG={{ language }}" > /etc/sysconfig/i18n
      - echo "LANG={{ language }}" >> /home/ec2-user/.bash_profile
      - echo "Terminal Language changed to {{ language }}"

注意事項

このドキュメントはべき等性を考慮していません。具体的には49行目の言語設定の箇所でec2-userの.bash_profileに対して追記処理があります。

ドキュメントの登録

ドキュメントをSSMに登録します。

CLIの場合

ドキュメントをファイルに保存して以下のコマンドを実行します。

aws ssm create-document --document-format YAML --content file:///Users/kato.ryo/Projects/AWS/SSM/Documents/User-AmazonLinux2-SetupScritp.yml --name "User-AmazonLinux2-SetupScript" --document-type "Command"

Amazon Management Consoleの場合

SSMのドキュメント画面を開きドキュメント作成をクリックします。

名前を入力し、コンテンツ形式をYAMLに設定します。

上記のUser-AmazonLinux2-SetupScript.ymlをフォームに貼り付けて、ドキュメントの作成をクリックします。

ドキュメントの実行

ドキュメントを使用して、RunCommandします。

作業対象のEC2を作成します。このEC2にはSSMを利用するためのロールをアタッチする必要があります。下記のリンクを参考にしてください。

Systems ManagerのRunCommandでSSHを使わずにShellライクにコマンドを実行する

SSMのRunCommand画面を開き、コマンドの実行をクリックします。

作成した、ドキュメントとEC2を選択します。

パラメータを設定し、実行します。

無事に成功しました!

EC2にSSHでログインして、状態を確認します。

hostnamectl status
Static hostname: blogtest
Pretty hostname: BlogTest
Icon name: computer-vm
Chassis: vm
Machine ID: 6c0dbeffde9846e48691730623978522
Boot ID: d48a1ee7c1294de89540f82e1370b3d4
Virtualization: xen
Operating System: Amazon Linux 2 (2017.12) LTS Release Candidate
CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2
Kernel: Linux 4.9.76-38.79.amzn2.x86_64
Architecture: x86-64

sudo yum update
読み込んだプラグイン:langpacks, priorities, update-motd
No packages marked for update

timedatectl status
Local time: 月 2018-04-09 15:27:00 JST
Universal time: 月 2018-04-09 06:27:00 UTC
RTC time: 月 2018-04-09 06:26:59
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

head -n 1 /etc/sysconfig/i18n
LANG=ja_JP.UTF-8

tail -n 1 ~/.bash_profile
LANG=ja_JP.UTF-8

意図した変更が全て適用されていました!