AWS再入門ブログリレー AWS Systems Manager編

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2019』の10日目のエントリです。

このブログリレーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2019年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。10日目のテーマは『AWS Systems Manager』です。

目次

AWS Systems Managerとは

AWS Systems Managerとは、AWSおよびオンプレミスのサーバ群を管理する多機能なツールセットの総称です。いろいろな観点でのグルーピングと関連リソースの整理の方法があると思いますが、すっきりまとめると以下のような感じになるかと思います。

  • 共有リソース
    • SSM Documents
    • Parameter Store
  • グループ化
    • OpsCenter
    • Resource Groups
  • スケジューリング
    • Maintenance Windows
  • オペレーション
    • Run Command
    • Automation
    • Distributer
    • Session Manager
  • 構成情報の集約・監査
    • State Manager
    • Inventory
    • Patch Manager

正直にお伝えすると、どこまでが"AWS Systems Manager"というサービスの中に収めるべきなのかよくわからなくなってきているといると思っています。前述した機能やサービスは、EC2インスタンスを管理対象とするものが多いのですが、それだけに留まらず、現在ではオンプレミスのリソースや他の様々なAWSリソースを、この"AWS Systems Manager"によってまとめて管理することができるようになっています。

AWS Systems Managerの歴史

AWS Systems Managerの良いところでもありますが、サービスのアップデートが非常に活発で、機能追加・拡張が頻繁に行われている為、最新のアップデートを追従するのが難しいということもあるかもしれません。

これまで利用されてきたSSMという略称も既に更新が間に合っていないだけで本来使われるべきではないという風にも読めるドキュメントもありました。

AWS Systems Manager (Systems Manager) was formerly known as "Amazon Simple Systems Manager (SSM)" and "Amazon EC2 Systems Manager (SSM)". The original abbreviated name of the service, "SSM", is still reflected in various AWS resources, including a few other service consoles. What Is AWS Systems Manager? - AWS Systems Manager

関連する情報として、最も古いと思われる情報がこちらです。

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

元々は、EC2 Windows限定の機能として登場し、AWS Directory Serviceで管理されたADへのドメイン参加する機能として実装されていました。このような経緯から、特にWindows on EC2では、古くから内部的に様々な形でSSM Agentで動作しているようです。

その流れを受けて2016年のre:Inventで発表されたのが、Amazon EC2 Systems Manager(SSM)です。

【速報】Amazon EC2 Systems Manager を発表 #reinvent

この名残から、AWS Systems ManagerがLaunchした後も、つい先日までAWS Management Console上では、EC2サービス画面内のSSM操作画面が残されており、混乱しやすかったのですが、最近になって削除されたようです。

EC2 on Windows用として、EC2のサブサービスのような位置付けからスタートし、特にエンタープライズなシーンでの利用の加速により、アップデートを重ねて来ているサービスであるということを把握しておくと良いと思います。

動作環境

AWS Systems Managerは、以下のような構成で動作します。EC2インスタンスまたはオンプレミスのサーバに導入されたSSM Agentを介して、AWS Systems Managerに情報を集約管理します。その結果を確認・監視しつつ、自動または手動で対象リソースを管理・操作することが可能です。

SSM Agentの動作環境としては、Inboundアクセス許可設定は不要ですが、Systems Manager APIへのOutbound通信が必要となりますので、プライベートサブネットに配置する場合には注意が必要となります。

SSM Agent

ということで、動作させる為には、AWS Systems Manager Agent (SSM Agent) が必要となるわけですが、その結果を内部的には、Amazon Message Delivery Serviceを介して受け取って動作します。

SSM AagentがAMI内にプレインストールされているOSは以下のとおりです。

  • Windows Server 2003-2012 R2 AMIs published in November 2016 or later
  • Windows Server 2016 and 2019
  • Amazon Linux
  • Amazon Linux 2
  • Ubuntu Server 16.04
  • Ubuntu Server 18.04

古いAMIを利用する場合、オンプレミスのサーバや、上記以外のOSを利用する場合には、SSM Agentのインストールが必要となります。サポートOSについては、下記ドキュメントにて確認しましょう。

また、SSM Agentはオンプレミス環境のインスタンスにも導入することが可能ですので、少し古いものですが興味のある方はこちらの記事もご覧ください。

EC2 Systems Managerでオンプレ環境のサーバを管理する #reinvent

AWS Systems Managerの料金

ほとんどの機能は無料で利用できますが、一部料金が発生するサービスがあるのでご注意ください。

  • OpsCenter
  • Advanced Parameter
  • Parameter StoreのAPI実行
  • オンプレミスインスタンス管理
  • Distributerでの非AWSパッケージ利用
  • Automation

各種レポートで利用されるログ出力等も課金対象となりますが、非常に安く統合された管理機能が利用できるという点が素晴らしいです。

AWS Systems Managerを構成する機能と要素

ということで、AWS Systems Managerを構成する機能と要素について、クラスメソッド発「やってみた」系技術メディア | Developers.IOからのおすすめ記事を積極的にご紹介する形で補足していきます。

まずは、共有リソースとして利用できる2つの要素について、理解をしておくと良いと思います。

SSM Documents

SSM Documentsは、管理対象のインスタンスに対して実行するアクションを定義したもので、AWS Systems Managerを構成する様々なサービスのバックエンドでも活用されている、AWS Systems Managerの核となる共有リソースです。先にご紹介した記事にあったWindowsのAD参加から始まり、現在では多数のドキュメントが利用できるようになっており、正直すべてのドキュメントについて把握するのは難しいです。何度も利用するようなものを定型化して再実行可能としてくれるので、同じようなアクションを繰り返し実行することが可能です。

2019年7月現在、こんなにも多くのドキュメントが用意されている状況で、まだまだ使いこなせていないです(この後にご紹介する各サービスから内部的に利用されているものも多数含まれていますが)。DocumentTypeとして、Command Document/Automation Document/Policy Document等があります。

$ aws ssm list-documents --query "DocumentIdentifiers[?Owner==\`Amazon\`].{Name:Name,PlatformTypes:to_string(PlatformTypes),DocumentType:DocumentType,SchemaVersion:SchemaVersion,DocumentFormat:DocumentFormat,TargetType:TargetType}" --output table
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                              ListDocuments                                                                              |
+----------------+---------------+----------------------------------------------------------------+----------------------+----------------+-------------------------------+
| DocumentFormat | DocumentType  |                             Name                               |    PlatformTypes     | SchemaVersion  |          TargetType           |
+----------------+---------------+----------------------------------------------------------------+----------------------+----------------+-------------------------------+
|  JSON          |  Automation   |  AWS-ASGEnterStandby                                           |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-ASGExitStandby                                            |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Command      |  AWS-ApplyDSCMofs                                              |  ["Windows"]         |  2.2           |  None                         |
|  JSON          |  Command      |  AWS-ApplyPatchBaseline                                        |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Automation   |  AWS-AttachEBSVolume                                           |  ["Windows","Linux"] |  0.3           |  None                         |
|  YAML          |  Automation   |  AWS-AttachIAMToInstance                                       |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Command      |  AWS-ConfigureAWSPackage                                       |  ["Windows","Linux"] |  2.0           |  None                         |
|  JSON          |  Command      |  AWS-ConfigureCloudWatch                                       |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Automation   |  AWS-ConfigureCloudWatchOnEC2Instance                          |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Command      |  AWS-ConfigureDocker                                           |  ["Windows","Linux"] |  2.0           |  None                         |
|  YAML          |  Automation   |  AWS-ConfigureS3BucketLogging                                  |  ["Windows","Linux"] |  0.3           |  /AWS::S3::Bucket             |
|  YAML          |  Automation   |  AWS-ConfigureS3BucketVersioning                               |  ["Windows","Linux"] |  0.3           |  /AWS::S3::Bucket             |
|  JSON          |  Command      |  AWS-ConfigureWindowsUpdate                                    |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Automation   |  AWS-CopySnapshot                                              |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Snapshot          |
|  JSON          |  Automation   |  AWS-CreateDynamoDbBackup                                      |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-CreateImage                                               |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-CreateJiraIssue                                           |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-CreateManagedLinuxInstance                                |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-CreateManagedLinuxInstanceWithApproval                    |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-CreateManagedWindowsInstance                              |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-CreateManagedWindowsInstanceWithApproval                  |  ["Windows","Linux"] |  0.3           |  None                         |
|  YAML          |  Automation   |  AWS-CreateSnapshot                                            |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Volume            |
|  JSON          |  Automation   |  AWS-DeleteCloudFormationStack                                 |  ["Windows","Linux"] |  0.3           |  /AWS::CloudFormation::Stack  |
|  JSON          |  Automation   |  AWS-DeleteCloudFormationStackWithApproval                     |  ["Windows","Linux"] |  0.3           |  /AWS::CloudFormation::Stack  |
|  YAML          |  Automation   |  AWS-DeleteDynamoDbBackup                                      |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-DeleteDynamoDbTableBackups                                |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWS-DeleteEbsVolumeSnapshots                                  |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Volume            |
|  JSON          |  Automation   |  AWS-DeleteImage                                               |  ["Windows","Linux"] |  0.3           |  None                         |
|  YAML          |  Automation   |  AWS-DeleteSnapshot                                            |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Snapshot          |
|  JSON          |  Automation   |  AWS-DetachEBSVolume                                           |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Volume            |
|  YAML          |  Automation   |  AWS-DisablePublicAccessForSecurityGroup                       |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::SecurityGroup     |
|  YAML          |  Automation   |  AWS-DisableS3BucketPublicReadWrite                            |  ["Windows","Linux"] |  0.3           |  /AWS::S3::Bucket             |
|  YAML          |  Automation   |  AWS-EnableCloudTrail                                          |  ["Windows","Linux"] |  0.3           |  None                         |
|  YAML          |  Automation   |  AWS-EnableS3BucketEncryption                                  |  ["Windows","Linux"] |  0.3           |  /AWS::S3::Bucket             |
|  JSON          |  Command      |  AWS-FindWindowsUpdates                                        |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Policy       |  AWS-GatherSoftwareInventory                                   |  ["Windows","Linux"] |  2.0           |  None                         |
|  JSON          |  Command      |  AWS-InstallApplication                                        |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-InstallMissingWindowsUpdates                              |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-InstallPowerShellModule                                   |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-InstallSpecificWindowsUpdates                             |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-InstallWindowsUpdates                                     |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-JoinDirectoryServiceDomain                                |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-ListWindowsInventory                                      |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Session      |  AWS-PasswordReset                                             |  ["Windows","Linux"] |  1.0           |  None                         |
|  JSON          |  Automation   |  AWS-PatchAsgInstance                                          |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-PatchInstanceWithRollback                                 |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  YAML          |  Automation   |  AWS-PublishSNSNotification                                    |  ["Windows","Linux"] |  0.3           |  /AWS::SNS::Topic             |
|  YAML          |  Automation   |  AWS-RebootRdsInstance                                         |  ["Windows","Linux"] |  0.3           |  /AWS::RDS::DBInstance        |
|  JSON          |  Command      |  AWS-RefreshAssociation                                        |  ["Windows","Linux"] |  2.0           |  None                         |
|  YAML          |  Automation   |  AWS-ReleaseElasticIP                                          |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::EIP               |
|  YAML          |  Automation   |  AWS-ResizeInstance                                            |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-RestartEC2Instance                                        |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-RestartEC2InstanceWithApproval                            |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Command      |  AWS-RunAnsiblePlaybook                                        |  ["Linux"]           |  2.0           |  None                         |
|  JSON          |  Command      |  AWS-RunDockerAction                                           |  ["Windows","Linux"] |  2.0           |  None                         |
|  JSON          |  Command      |  AWS-RunDocument                                               |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Command      |  AWS-RunInspecChecks                                           |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Command      |  AWS-RunPatchBaseline                                          |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Command      |  AWS-RunPowerShellScript                                       |  ["Windows","Linux"] |  1.2           |  None                         |
|  JSON          |  Command      |  AWS-RunRemoteScript                                           |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Command      |  AWS-RunSaltState                                              |  ["Linux"]           |  2.0           |  None                         |
|  JSON          |  Command      |  AWS-RunShellScript                                            |  ["Linux"]           |  1.2           |  None                         |
|  JSON          |  Automation   |  AWS-SetupInventory                                            |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-SetupManagedInstance                                      |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-SetupManagedRoleOnEc2Instance                             |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-StartEC2Instance                                          |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-StartEC2InstanceWithApproval                              |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  YAML          |  Automation   |  AWS-StartRdsInstance                                          |  ["Windows","Linux"] |  0.3           |  /AWS::RDS::DBInstance        |
|  JSON          |  Session      |  AWS-StartSSHSession                                           |  ["Windows","Linux"] |  1.0           |  None                         |
|  JSON          |  Automation   |  AWS-StopEC2Instance                                           |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-StopEC2InstanceWithApproval                               |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  YAML          |  Automation   |  AWS-StopRdsInstance                                           |  ["Windows","Linux"] |  0.3           |  /AWS::RDS::DBInstance        |
|  JSON          |  Automation   |  AWS-TerminateEC2Instance                                      |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-TerminateEC2InstanceWithApproval                          |  ["Windows","Linux"] |  0.3           |  /AWS::EC2::Instance          |
|  JSON          |  Automation   |  AWS-UpdateCloudFormationStack                                 |  ["Windows","Linux"] |  0.3           |  /AWS::CloudFormation::Stack  |
|  JSON          |  Automation   |  AWS-UpdateCloudFormationStackWithApproval                     |  ["Windows","Linux"] |  0.3           |  /AWS::CloudFormation::Stack  |
|  JSON          |  Command      |  AWS-UpdateEC2Config                                           |  ["Windows"]         |  1.2           |  None                         |
|  JSON          |  Automation   |  AWS-UpdateLinuxAmi                                            |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Command      |  AWS-UpdateSSMAgent                                            |  ["Windows","Linux"] |  1.2           |  None                         |
|  JSON          |  Automation   |  AWS-UpdateWindowsAmi                                          |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-ActivateWindowsWithAmazonLicense                   |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-ExecuteEC2Rescue                                   |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-GrantPermissionsToIAMUser                          |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-ManageRDPSettings                                  |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-ManageWindowsService                               |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-ResetAccess                                        |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Command      |  AWSSupport-RunEC2RescueForWindowsTool                         |  ["Windows"]         |  2.2           |  None                         |
|  JSON          |  Automation   |  AWSSupport-SendLogBundleToS3Bucket                            |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-SetupIPMonitoringFromVPC                           |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-StartEC2RescueWorkflow                             |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-TerminateIPMonitoringFromVPC                       |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-TroubleshootRDP                                    |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-TroubleshootSSH                                    |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSSupport-UpgradeWindowsAWSDrivers                           |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Command      |  AmazonInspector-ManageAWSAgent                                |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Command      |  AWSEC2-ApplicationInsightsCloudwatchAgentInstallAndConfigure  |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Automation   |  AWSEC2-CloneInstanceAndUpgradeSQLServer                       |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Automation   |  AWSEC2-CloneInstanceAndUpgradeWindows                         |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Command      |  AWSEC2-CreateVssSnapshot                                      |  ["Windows"]         |  2.2           |  None                         |
|  JSON          |  Command      |  AWSEC2-ManageVssIO                                            |  ["Windows"]         |  2.2           |  None                         |
|  JSON          |  Command      |  AWSEC2-RunSysprep                                             |  ["Windows"]         |  2.2           |  None                         |
|  JSON          |  Automation   |  AWSEC2-SQLServerDBRestore                                     |  ["Windows","Linux"] |  0.3           |  None                         |
|  JSON          |  Command      |  AmazonCloudWatch-ManageAgent                                  |  ["Windows","Linux"] |  2.2           |  None                         |
|  JSON          |  Command      |  AmazonCloudWatch-MigrateCloudWatchAgent                       |  ["Windows"]         |  2.2           |  None                         |
+----------------+---------------+----------------------------------------------------------------+----------------------+----------------+-------------------------------+

独自でSSM Documentsを作ってみた記事もぜひご欄ください。

AWS Systems Manager のドキュメントを作って、使ってみた。

Parameter Store

Parameter Storeでは、設定データ管理と機密管理のための安全な階層型ストレージが提供されています。パスワード、データベース文字列、ライセンスコードなどのデータをパラメータ値として保存することができます。

社内勉強会でパラメーターストアについて発表しました

直近ですと、Advanced Parrameterが提供開始され、よりハイパフォーマンスな用途での利用が可能となっています。

パラメーターストアが大幅にアップデートしました!

また、パブリックなパラメータストアとして、AWSが用意し利用可能となっているものもありますので、ケースに応じて活用すると便利です。

CloudFormationでいつでも最新のWindows AMIからEC2を起動したい(パブリックパラメータストア利用)

AWS Systems Manager パラメーターストアを利用してAWSサービス一覧を取得してみる

続けて、管理対象リソースをグルーピングするサービスについてご紹介していきます。

OpsCenter

2019年6月に登場したOpsCenterは、運用担当者がAWSリソースに関連する運用作業項目(OpsItems)を表示、調査、解決する為のサービスです。AWS リソースに影響を与える問題の解決までの平均時間を短縮するように設計されています。

[新機能] Systems Manager OpsCenter がリリースされました!

CloudWatch Eventsとの統合機能により、OpsItemsには自動でインスタンスを追加することが可能ですし、手動での管理対象リソースも追加も可能です。Automation Documentと組み合わせることで、CloudWatch Events発生をトリガーとした自動復旧の機構を用意することも可能です。

Resource Groups

Resource Groupsにより、同一Region内のクエリで指定された条件に適合するAWSリソースのコレクションを管理することができます。Resource Group単位に管理対象をまとめておいて、各グループ単位で後続の様々な管理機構を利用することが可能です。

[AWS]リソースグループを使って、テスト・ステージング・本番環境ごとにAWSリソースを管理する

次に、スケージューリング機能です。正確には、他にもスケジュール機能を有している機能があるのですが、スケジュール管理のみを司るのはこちらかと思います。

Maintenance Windows

Maintenance Windowsは、OSパッチ適用、ドライバー更新、SWパッチのインストールなど、管理対象インスタンスに対しての変更アクション(Run Command、Automaction、Lambda、Step Functionを起動)をスケジュール定義する機能です。事前に決まられた時間にアクションを行いたい場合に利用します。

Systems Manager Maintenance Window で 任意のEC2インスタンスを定期再起動する

その他、少し古い記事ですが、ユースケースの参考として下記もご覧ください。

続けて、各種変更操作を行うための機能をご紹介していきます。ここが種類が多くてなかなかややこしいところです。

Run Command

Run Commandは、事前に定義したSSM DocumentをSSM Agent導入済みの管理対象インスタンスに対して実行する機能です。AWS Systems Managerのサーバ管理業務で必要となるRDPやSSHでのログインなしに、管理対象リソースをまとめて操作することが可能です。事前に定義したSSM Documentと書きましたが、実際には、"AWS-RunShellScript"や"AWS-RunPowerShellScript"という任意のコマンドを引数から渡すことができるDocumentがありますので、任意のコマンドを管理者権限で実行することが可能です。

[小ネタ] 再起動を伴うSSM Run Commandの書き方

Automation

Automationは、自動化ワークフローを構築して、インスタンスおよびAWSリソースを管理する機能です。AWSが定義済のワークフローだけでなく、独自のカスタムワークフローを作成することも可能です。定義したワークフローの進捗は、CloudWatch Events経由の通知やAWS Systems Managerコンソールから確認することが可能です。

公式ドキュメントに記載されているユースケースは以下の通りです。

  • 一般的な IT タスクを実行する
    • 承認に基づくワークフロー管理
  • 破壊的なタスクを一括して安全に実行する
    • Resource Groupsと組み合わせて複数台をまとめて操作
  • 複雑なタスクの簡素化
    • AWS-UpdateLinuxAmi、AWS-UpdateWindowsAmiによるAMI作成の自動化
    • AWSSupport-ExecuteEC2Rescueを利用した障害インスタンスの復元
  • 運用のセキュリティを拡張する
    • AutomationへのIAMロール埋め込みによる委任管理者による運用
  • ベストプラクティスを共有する
    • ノウハウとしてのAutomation Document共有

その他、下記記事もぜひご覧ください。

SSM Automationを使ってWindows Update実行を自動化

SSM Automationを試すときに使いたいステップ実行の紹介

SSM Automationが失敗したら通知するCloudWatch Eventを設定してみた

AutoScalingで1台ずつ自動的にパッチを当てるSSM Automationやってみた

Distributer

Distributerを利用すれば、独自のソフトウェアをパッケージ化したり、AmazonCloudWatchAgentなどのAWS提供のエージェントソフトウェアパッケージを見つけて、管理対象インスタンスにインストール(Run Commandで1回のみ/State Managerでスケジュール)することが可能です。

Systems Manager Distributor を活用してソフトウェア配布を行う!

Session Manager

Session Managerは、インバウンドポートを開いたり、踏み台ホストを維持したり、SSHキーを管理したりすることなく、安全で監査可能なインスタンスの管理することを可能とする機能です。

SSH不要時代がくるか!?AWS Systems Manager セッションマネージャーがリリースされました!

こちらの機能に直近で嬉しいアップデートがあり、社内外とも反響が大きいです。サーバ保守の為に、Inboundアクセス許可設定は一切不要となるので、今後はこれがスタンダードになっていく可能性もあると思います。

AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました

最後は、管理対象の状態を監査、管理する為の機能をご紹介します。

State Manager

State Managerは、EC2またはオンプレインスタンスを定義された状態に保つプロセスを自動化する、安全でスケーラブルなサービスです。ポリシーに準拠したあるべき設定を維持する為に利用します。

例えば、以下のようなタスクをState Managerで管理することが可能です。

  • 起動時に特定のソフトウェアを使用してインスタンスをブートストラップする
  • 定義済みのスケジュールに従ってエージェント (SSM エージェント など) をダウンロードして更新する
  • ネットワーク設定を構成する
  • インスタンスを Windowsドメインに結合する (Windows インスタンスのみ)
  • ライフサイクルを通じてソフトウェアの更新でインスタンスをパッチする
  • ライフサイクルを通じて Linux および Windows マネージドインスタンスでスクリプトを実行する

設定の大まかな流れは以下のとおりです。

  1. あるべき姿をSSMドキュメントとして定義(※またはAWSが事前定義済のものを利用する)
  2. 管理対象リソースとSSMドキュメントを関連付け
    • Command Document/Policy Documentであれば、チェックするスケジュールを合わせて設定
    • Automation Documentであれば、Automationワークフローの一部として定義する

Inventory

Inventoryにより、管理対象上のアプリケーション一覧など構成情報を記録することができます。AWS Configに構成情報を送信して、Config Rulesと組み合わせて管理を行ったり、S3に保存した構成情報をAthena & QuickSightで可視化して分析することも可能です。

EC2インスタンスにインストールされているソフトウェアとバージョン一覧を表示したい

AWS Systems Managerインベントリはどのアプリケーション情報を収集しているのか調べてみた

Patch Manager

Patch Managerは、管理対象に対してパッチ適用ルールを指定し、そのパッチ適用やレポーティング等を自動化してくれる機能です。具体的には、以下の流れで設定を行います。

  1. パッチベースラインの作成(定義済/カスタム)
  2. パッチグループの作成(管理対象を規定)
  3. パッチベースラインにパッチグループを追加
  4. パッチ適用のMaintenanceWindowを作成

Windows マネージドインスタンスと Linux マネージドインスタンスで、どのパッチを提供するかを評価するプロセスが異なります。Windows のパッチ適用では、Systems Manager はパッチベースラインルールと承認済みおよび拒否済みパッチのリストをサービス内で直接評価します。これが可能なのは、Windows パッチが単一のリポジトリ (Windows Update) から取得されるためです。

SSMパッチマネージャー利用時のハマりポイントをまとめてみた

合わせて読みたい

これまでのリンク以外にも参考資料も置いておきます。

まとめ

以上、『AWS サービス別 再入門ブログリレー 2019』の10日目のエントリ『AWS Systems Manager編』でした。個人的には、ずっと整理したかった、Systems Managerの各機能の守備範囲が整理できてすっきり、と言いたいところですが、機能が多くてさらに調べてみたいことが増えてしまいました!みなさんにとっても最新のアップデートを見直していただく機会になれば幸いです。

週明け火曜日(7/16)は、 Takuya Shibata の『AWS Backup』編です。お楽しみに!