AWSの新サービス SSM を知っていますか?

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

ウィスキー、シガー、パイプをこよなく愛する大栗です。 ほとんど話題になっていませんが、最近AWSにSSMという新サービスが増えたことをご存知でしょうか?AWSの公式ブログ【新機能】EC2インスタンスのシームレスなドメインへの参加 で一部紹介されているのですが、独立したサービスとして記載されていないので紹介したいと思います。

SSM?

SSMはAmazon EC2 Simple Systems Managerの略で、Windowsの構成管理を行えるサービスです。 AWSがWindows用のChef ServerやPuppet Masterを提供してくれる様なものです。 現在SSMで実行可能な設定は、以下の4種類です。

  • aws:applications
  • aws:cloudWatch
  • aws:domainJoin
  • aws:psModule

実行可能なタスク

aws:applications

アプリケーションのインストール/修復/アンインストールを行うことが可能です。msiファイルのみ対応しています。また、SHA256のハッシュチェックを行うことが可能です。

aws:cloudWatch

CloudWatchやCloudWatch Logsへデータを出力することが可能です。

aws:domainJoin

AWS Directory Serviceのドメインに参加することが可能です。現在は参加するのみです。 自前で立てたActive Directoryには参加できません。

aws:psModule

PowerShellモジュールをインストールできます。また、インストール後にコマンドを実行することも可能です。

SSMはどのように動作するの?

準備

SSMの操作をする前に以下の準備が必要です。

  1. SSMで実行する操作の権限があるIAM Roleを作成し、Windowsインスタンスに付与する
  2. WindowsインスタンスのEC2ConfigのバージョンがVersion 3以上であること
  3. 操作対象のインスタンスにPublic IPがされて外部へアクセスできる。(NAT経由で外部へアクセスできれば操作可能だと思われますが未検証です)
  4. (Option)ドメインに参加する場合は、操作対象インスタンスがDirectory Serviceと同じVPCにあること

documentを作成する

まずは、JSONファイルをdocumentとしてSSMへ登録します。以下のようなコマンドを実行します。

$ aws ssm create-document --content file:////path//to//document.json --name DocumentName

Untitled (5)

documentをインスタンスに紐付ける

作成したdocumentをインスタンスに紐付けます。

$ aws ssm create-association --instance-id i-xxxxxxxx --name DocumentName

Untitled(1)

EC2Configが実行する

WIndows ServerインスタンスにインストールされているEC2ConfigがSSMのdocumentを読み込み、処理を実行します。

Untitled(2)

実際に使ってみる

今回はDirectory Serviceのドメインに参加してみます。

IAM Roleを作成する

本当はDirectory Serviceに参加する最小の権限にすべきなのですが、今回は全権限を与えたIAM Roleを作成しています。このIAM Roleを付与したWindows Serverを起動します。使用したAMIはWindows_Server-2012-RTM-Japanese-64Bit-Base-2015.02.11 (ami-3e7a3256)です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}

SSMにdocumentを作成する

Directory Serviceへ参加するdocumentをjson形式で作成します。以下のようにDirectory Serviceへの参加情報を入力したファイルを作成します。

{
  "schemaVersion": "1.0",
  "description": "Sample configuration to join an instance to a domain",
  "runtimeConfig": {
    "aws:domainJoin": {
      "properties": {
          "directoryId": "d-xxxxxxxxxx",
          "directoryName": "cm.local",
          "dnsIpAddresses": ["10.200.101.187","10.200.100.241"]
      }
    }
  }
}

以下のコマンドを実行して、作成したファイルをSSMへ登録します。

$ aws ssm create-document --content file:////path//to//document.json --name DocumentName --region us-east-1
{
    "DocumentDescription": {
        "Status": "Creating", 
        "Sha1": "365f93cde1848263355c2dc0a872760eebb394dd", 
        "Name": "DocumentName", 
        "CreatedDate": 1425549147.088
    }
}

documentをインスタンスへ紐付ける

documentをインスタンスへ紐付けます。

$ aws ssm create-association --instance-id i-xxxxxxxx --name DocumentName --region us-east-1
{
    "AssociationDescription": {
        "InstanceId": "i-xxxxxxxx", 
        "Date": 1425549160.487, 
        "Name": "DocumentName", 
        "Status": {
            "Date": 1425549160.487, 
            "Message": "Associated with DocumentName", 
            "Name": "Associated"
        }
    }
}

実行結果を確認する

SSMの実行結果を確認します。

SSMのステータスを確認する

以下のコマンドを実行して、ステータスを確認します。なお、EC2Configが実行するまでに時間がかかる場合があります。 処理が実行される前は"Status"の"Name"が"Associated"になっています。処理が成功すると"Success"、失敗すると"Failed"になります。

$ aws --profile DirectoryServiceAccount --region us-east-1 ssm describe-association --instance-id i-xxxxxxxx --name DocumentName
{
    "AssociationDescription": {
        "InstanceId": "i-xxxxxxxx", 
        "Date": 1425552139.996, 
        "Name": "DocumentName", 
        "Status": {
            "Date": 1425552827.387, 
            "AdditionalInfo": "{agent=EC2Config,ver=3.0.54,osver=6.2.9200,os=Windows Server 2012 Standard,lang=ja-JP}", 
            "Message": "RunId=b67d7103-9c54-4dea-9db7-c12d5792960a, status:Passed, code:0, message:RuntimeStatusCounts=[Passed=1], RuntimeStatus=[aws:domainJoin={Passed,The instance is already joined to requested domain: cm.local}]", 
            "Name": "Success"
        }
    }
}

インスタンスがドメインに参加していることを確認する

以下のようにcm.localドメインに参加しています。

ssm-test01

さいごに

今回はドメインへ参加してみました。同様のことはUserDataへ記述することで外部の操作から実施できます(EC2 User DataによるActive Directoryドメインへの自動参加を参照)。しかしドメイン参加用ユーザのパスワードを入力する必要があるため、インスタンスメタデータからパスワードが分かってしまいます。SSMを使用するとそのような情報を一切記載する必要がなくなります。

Windowsの構成管理としてはMicrosoft純正のPowerShell DSCがあります。Windowsの詳細な操作を行う場合はDSCやChef等を使用する方が良いと思いますが、ちょっとした構成をSSMで管理する使い方は良さそうだと思いました。

なお、SSMは現在バージニアリージョンのみで使用可能です。東京リージョンに来たらすぐ使える様に準備しておきましょう!