APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AWS Application Migration ServiceのPost-launch actionを利用する

はじめに

こんにちは、クラウド事業部の山路です。

今回もAWS Application Migration Service (以降AWS MGN) の機能を紹介します。

AWS MGNは既存のサーバーを主にRehost形式でAWSに移行するのをサポートするサービスですが、移行に合わせてサーバーを更新したい、AWS上での運用に向けて設定変更したい、というケースもあるかと思います。

今回はそういったときに利用できる機能として、Post-launch actionを紹介します。

Post-launch actionとは

Post-launch actionは、AWS MGNのソースサーバーからテスト・カットオーバーサーバーを起動したのちに、特定の処理を自動的に実行する機能です。

Post-launch actionはAWS Systems Managerの機能を利用して実行されます。そのため、Post-launch actionはSystems Manager Agent (SSM Agent) の利用が前提となり、この機能を有効化すると自動的にSSM AgentのインストールがActionとして設定されます。

また、Post-launch actionは、AWSによってあらかじめ用意されたアクション (Predefined post-launch action) と、利用者が設定するアクション (Custom post-launch action) の2種類があります。

Predefined post-launch action

Predefined post-launch actionは、現在19種類の処理から選択できます。ただしそのうちのSSM Agentのインストール処理は、Post-launch actionを有効化すると自動的についてくる処理です。

ここではPredefined actionからいくつかの例を紹介します。

  • OSやライセンスの更新: Windows upgradeというActionは、ソースサーバーがWindowsの場合、指定のバージョンにWindowsをアップデートする処理を実行します。これに似た処理に、ソースサーバーのOSがCentOsの場合、Rocky Linuxに変換する CentOS to Rocky というActionもあります。
  • サーバーへのインストール・設定変更: CloudWatch agent installation というActionを使用すると、テスト・カットオーバーサーバーにCloudWatch agentのインストールと設定を実行します。
  • 起動後の状態確認: EC2 connectivity check は、サーバー起動後、あらかじめ設定したIPアドレス・ポートに対して、ネットワーク疎通を確認します。似たようなものに、起動後のプロセス確認をする Process status validation というActionもあります。

Custom post-launch action

Custom post-launch actionは、Systems Managerドキュメントから利用するものを選択します。Custom post-launch actionの設定項目はPredefined actionと共通していますが、ここで一部紹介します。

  • このアクションをアクティブ化する : 作成したActionを有効化するか否か指定します。
  • Systems Managerドキュメント名 : Actionで使用するSystems Managerドキュメントを選択します。
  • 順序 : 各Actionは実行順序をもち、番号の若いほど先に実行されます。Predeined Actionは 1 - 1,000 、Custom Actionは 1,001 - 10,000 の中で選択します。
  • オペレーションシステム : 対象のサーバーのOSを指定します。 Windows Linux もしくは両方を指定できます。
  • アクションパラメータ : 選択したSystems Managerドキュメントによっては、追加の設定項目が表示されます。

※詳細な設定項目は AWSドキュメント を参照してください。

Post-launch Actionを利用する

ここからは実際にpost-launch actionを動かします。今回はPredefined / Custom actionの両方を設定し、それぞれ以下のActionを利用しました

  • Predeined: CloudWatch agent installation
  • Custom: AWS-HelloWorld ドキュメントを使用

事前準備: IAMロール・SSMパラメータストアの作成

ソースサーバーを用意する前に、いくつか事前準備を済ませます。まずはIAMロール・SSMパラメータストアの作成を行います。

今回はPredefined post-launch actionでCloudWatch Agentのインストールと設定を実行します。このActionでは、CloudWatch Agentに設定する情報を、SSM Parameter Storeから取得します。そのため、まずはSSM Parameter Storeに値を登録する必要があります。また、AWS MGNで起動したテストサーバーがCloudWatchにアクセスできるよう、IAMロールを付与する必要もあります。

今回は以下のCloudFormationテンプレートから必要なリソースを作成しています。

CloudFormationテンプレート

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  EnvName:
    Type: String
    Default: mgn-example

Resources:
  EC2IAMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${EnvName}-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - Ref: EC2IAMRole
      InstanceProfileName: !Sub ${EnvName}-EC2InstanceProfile

  CloudWatchConfigParemeter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: AmazonCloudWatch-mgn-config
      Type: String
      Value: !Sub |
        {
                "agent": {
                        "metrics_collection_interval": 60,
                        "run_as_user": "root"
                },
                "logs": {
                        "logs_collected": {
                                "files": {
                                        "collect_list": [
                                                {
                                                        "file_path": "/var/log/messages",
                                                        "log_group_name": "messages",
                                                        "log_stream_name": "{instance_id}",
                                                        "retention_in_days": 1
                                                }
                                        ]
                                }
                        }
                },
                "metrics": {
                        "aggregation_dimensions": [
                                [
                                        "InstanceId"
                                ]
                        ],
                        "append_dimensions": {
                                "AutoScalingGroupName": "${!aws:AutoScalingGroupName}",
                                "ImageId": "${!aws:ImageId}",
                                "InstanceId": "${!aws:InstanceId}",
                                "InstanceType": "${!aws:InstanceType}"
                        },
                        "metrics_collected": {
                                "disk": {
                                        "measurement": [
                                                "used_percent"
                                        ],
                                        "metrics_collection_interval": 60,
                                        "resources": [
                                                "*"
                                        ]
                                },
                                "mem": {
                                        "measurement": [
                                                "mem_used_percent"
                                        ],
                                        "metrics_collection_interval": 60
                                },
                                "statsd": {
                                        "metrics_aggregation_interval": 60,
                                        "metrics_collection_interval": 60,
                                        "service_address": ":8125"
                                }
                        }
                }
        }

また、AWS MGNで起動するサーバーが必要なIAM権限を持つよう、Launch templateを一部修正します。上記CloudFormationテンプレートで作成したEC2 InstanceProfileを指定し、起動後のサーバーが適切なIAMポリシーを付与されるようにします。

事前準備: Post-launch actionの設定

続いてPost-launch actionを設定します。Post-launch actionの設定は、設定後に登録されたソースサーバーに対して有効となります。そのため、まずはPost-launch actionを定義する必要があります。

Post-launch actionを始めて利用する場合、まずは機能を有効化する必要があります。Post-launch actionの設定画面に移動すると以下のような画面が表示されるので、「編集」を選択します。

編集画面では、SSM Agentのインストールの有効化、Post-launch actionの実行対象のサーバーを選択します。ここでは テストインスタンスのみ を選択しました。

Post-launch actionを有効化したので、まずはPredefined actionの設定をします。Post-launch actionを有効化するとPredefined actionのリストが表示されるので、その中から CloudWatch agent installation を選択し、「編集」ボタンを選択します。

編集画面ではまず このアクションを有効化する を選択します。またアクションパラメータの parameterStoreName に、先ほど作成したSSM Parameter Store中のパラメータ名を入力します。

続いてCustom post-launch actionの設定をします。Post-launch actionの画面から アクションの作成 を選択します。

設定画面では、以下のようにパラメータ等を指定しました。

  • アクション名 : aws-helloworld
  • Systems Managerドキュメント名 : AWS-HelloWorld
  • 順序 : 1001
  • オペレーティングシステム : WindowsおよびLinux

テストサーバーの作成

事前準備を完了したので、ソースサーバーを追加し、テストサーバーの作成を行います。

Post-launch actionを設定していると、テストサーバーを作成後、Actionの実行状況をAWS MGNの画面から確認できます。

動作確認

Post-launch actionが完了したら、それぞれ動作確認をします。

今回のCloudWatch agentの設定では、メトリクス・ログの設定をしています。まずメトリクス画面を見ると、設定したメトリクスが取得できていることを確認できます。

次にログのほうですが、今回はテストサーバーに一度ログインし、/var/log/messages ファイルを作成、テスト用のメッセージを入力しました。その結果CloudWatchにも同様のメッセージを確認できます。

次にCustom actionのほうですが、 AWS-HelloWorld はサーバーに設定変更などを行うものではなく、Systems Managerからの操作を確認するためのものです。Custom actionの実行ログを確認すると、問題なく実行されたことを確認できました。

最後に

弊社はAWSアドバンスドティアサービスパートナー認定を受けております。また以下のようにAWSの活用を支援するサービスも行っているので、何かご相談したいことがあればお気軽にご連絡ください。

www.ap-com.co.jp