Amazon Web Services ブログ

カスタマイズした AWS MGN 起動後アクションと Amazon CodeWhisperer を利用したデプロイスクリプト

本記事は 2024年1月4日に公開された ”Custom Post-launch actions and Deployment scripting using AWS Systems Manager and Amazon CodeWhisperer” を翻訳したものです。

このシリーズのパート 1 では、AWS でのブルー/グリーンのテストとデプロイについて学びました。これは、デプロイが失敗した場合のロールバックプロセスを簡略化することで、アプリケーションの可用性を高め、デプロイのリスクを軽減するための重要な戦略です。AWS Application Migration Service (AWS MGN) による継続的なレプリケーション機能と、事前定義済みの起動後アクションを利用することでデプロイプロセスを簡素化する方法を紹介しました。

パート 2 では、さらに深く掘り下げて、制御と効率性を最大限に高める方法を説明します。具体的には、カスタマイズした起動後アクションと、Amazon CodeWhisperer を利用したテスト/移行スクリプトを紹介します。CodeWhisperer は Generative AI を利用したコーディング支援ツールとして機能し、統合開発環境 (IDE) 内でコンテキストに応じたコードの提案をリアルタイムに行います。CodeWhisperer は、特定のプログラミングタスクの内容についての自然言語によるコメントに基づいてコードを提案をしてくれます。これにより、ソフトウェア開発プロセスが合理化されるだけでなく、既製のコードスニペットを使用できるようになります。これらのスニペットは、シンプルな英語のコメントと一致しているので、内容を簡単に受け入れたり、詳しく調べたり、必要に応じて修正して正確に実装したりすることができます。

この機能を使うことで、柔軟性を維持しつつ AWS リソースの管理をより細かく制御できるようになります。これにより、マネージメントコンソールを使うのではなく、プログラム的なアプローチで AWS リソースを操作することができるため、独自のニーズに対してより効率的かつ信頼性の高いデプロイが行えるようになります。ソフトウェア開発のペースが速いような開発において、この機能は非常に効果的なツールとなります。

検証に パート 1 と同じ環境を用いる場合、AWS MGN テストインスタンスがすでに起動されているようでしたら、改めて動作確認をするために、一度ソースサーバーを切断し状態を白紙に戻すことを検討してください。

ソリューション概要

AWS Application Migration Service (AWS MGN)、Amazon CodeWhisperer、Amazon EC2 などの AWS サービスを使用すると、次のことが可能になります。

  1. カスタマイズした AWS MGN 起動後アクションを新規に作成します。
  2. 起動後アクションが作成されたら、ブルー (移行元) バージョンのインスタンスを AWS MGN に新たに接続します。これは、起動後アクションの変更が、新しく追加されたソースサーバーにのみ適用されるため必要となるステップです。
  3. テストインスタンスを作成したら、グリーン (移行先) バージョンの Amazon EC2 インスタンスに対して様々な AWS サービスや機能を追加して試します。
  4. これを実現するために、Amazon CodeWhisperer を用いて記述した boto3 Python スクリプトを使用します。このスクリプトにより、グリーン (移行先) バージョンのインスタンスに AWS サービスをアタッチする、分かりやすく反復可能なレシピが作成できます。
  5. 最後のステップでは、パート 1 で説明したように、リソースの削除やグリーン (移行先) バージョンのインスタンスのカットオーバープロセスの完了などを行います。

ターゲットアーキテクチャ

次の図は、当ソリューションのアーキテクチャを示しています。

図 1: Amazon CodeWhisperer とカスタマイズした AWS MGN 起動後アクションを使ったブルー/グリーンデプロイテストソリューションのアーキテクチャ

  1. カスタマイズした AWS MGN 起動後アクションの設定
  2. ブルー (移行元) バージョンのインスタンスへの MGN エージェントのインストール
  3. Amazon CodeWhisperer を用いた boto3 Python スクリプトの作成
  4. コマンドラインからのスクリプトの実行
  5. AWS MGN にてカットオーバープロセスを完了
  6. Amazon Route 53 で DNS ルーティングを更新

詳しい説明

1. カスタマイズした AWS MGN 起動後アクションの設定

最初のパートでは、MGN でカスタマイズした起動後アクションを新たに作成するために必要となる初期設定について説明します。

図 2: AWS MGN マネージメントコンソール、起動後テンプレートのセクション

AWS MGN サービスページの [起動後テンプレート] タブを使用して、カスタマイズした AWS MGN 起動後アクション作成します。図 2 に表示されている通り、テンプレートに加えられた変更は、新しく追加されたソースサーバーにのみ適用されます。

図 3: AWS MGN 起動後テンプレート、新規アクションの追加

[アクションを作成] ボタンを選択し、表示されるプロンプトの入力をします。Systems Manager ドキュメントとして、事前定義済みの起動後テンプレートとしては提供されていない、様々なユースケースで利用できるドキュメントが選択できます。

: 目的の Systems Manager ドキュメントがリストにない場合は、独自のドキュメントを作成できます。

図 4: ロードバランサーと Auto Scaling グループを作成する Systems Manager ドキュメント

ターゲットアーキテクチャの構成に合わせて、[AWS Migration – CreateLoadBalanceAutoScaleGroup] ドキュメントを選択します。ドキュメントの詳細情報を表示するには、選択したドキュメントの横にある [Systems Manager で表示] ボタンを選択します。

: Systems Manager では、ドキュメントを検索したり、頻繁に使用するドキュメントをお気に入りに追加してアクセスしやすくすることができます。

図 5: カスタマイズした AWS MGN 起動後アクション。選択した SSM ドキュメントに応じて様々な依存関係が必要となります

設定したい SSM ドキュメントを選択したら、必要なパラメータ項目を入力して設定プロセスを完了します。設定が必要なパラメータは、選択した SSM ドキュメントによって異なります。AWS MGN には、各アクションの実行優先順位を指示するオーダー機能のような標準的な機能が含まれています。

図 6: アクションの作成が正常に完了したことを示すメッセージ

カスタマイズした AWS MGN 起動後アクションが正常に作成されたら、ブルー (移行元) バージョンのインスタンスに MGN エージェントをインストールし、テストインスタンスを起動して、カスタムアクションがグリーン (移行先) バージョンのインスタンスに適用されていることを確認します。

2. ブルー (移行元) バージョンのインスタンスへの MGN エージェントのインストール

パート 1 のセクション 5 の説明の通りに AWS MGN エージェントをインストールし、移行を開始します。

図 7: AWS MGN コンソールに表示される MGN サーバー移行のライフサイクル

最初のデータレプリケーションが完了すると、AWS MGN のライフサイクルは[テストの準備完了]に移行します。[テストおよびカットオーバー] のドロップダウンメニューを選択し、テストインスタンスを起動します。AWS MGN は 自動的に変換サーバーをプロビジョニングし、グリーン (移行先) バージョンのテストインスタンスを生成します。[起動後のアクション]のステータスで、選択した起動後アクションが正常に動作したかを確認することができます。AWS MGN エージェントや起動後アクションにてエラーが発生した場合は、「起動エラーのトラブルシューティング」を参照してください。

テストインスタンスを起動したら、カスタマイズした起動後アクションによりデプロイされたリソースや機能を確認するなど必要に応じてテストを行い、最終的には当ブログの最後に記載するカットオーバープロセスに進むことができます。

次のセクションでは、グリーン (移行先) バージョンのインスタンスに AWS サービスをアタッチする別の方法として、スクリプトを使用する方法について説明します。

3. Amazon CodeWhisperer を用いた boto3 Python スクリプトの作成

このセクションでは、Amazon の Generative AI を利用したコーディング支援ツールである、CodeWhisperer を活用して、グリーン (移行先) バージョンの インスタンスに対して様々な AWS サービスや機能をアタッチするといった、シンプルで反復可能なプロセスを構築することに焦点を当てます。CodeWhisperer を IDE で利用することで、リアルタイムにコードの提案がなされるため、素早くスクリプトを構築することができます。

まず、IDE(このブログでは VS Code)を開き、CodeWhisperer ユーザーガイド:セットアップに従ってセットアップを完了させます。

図 8: VSCode にて新規 Python ファイルを作成

コマンドラインから実行することで、AWS リソースの操作を行えるような
boto3 Python スクリプトを作成します。左側の DEVELOPER TOOLS パネルで、CodeWhisperer 自動提案がオンになっていることを確認できます。CodeWhisperer が提案するコードは、ライトグレーの部分となります。

図 9: ライトグレーの部分が Amazon CodeWhisperer による提案コード

Amazon CodeWhisperer は、ユーザーがスクリプトを記述するときに、コードの一部をオートコンプリートするよう提案します。矢印キーを使用してこれらのオプションを選択し、Tab キーを押してオプションを選択し、コードを貼り付けることができます。

ここでは、Amazon EC2 インスタンスに接続するための Amazon Elastic Load Balancerターゲットグループを作成し、HTTP トラフィックのポート 80 へのアクセスを許可するようにセキュリティグループを更新し、Elastic IP アドレスAWS Auto Scaling グループを追加するスクリプトを用意します。これらのリソースにより、インスタンスへのネットワークトラフィックの送信をテストし、AWSの自動スケーリングと負荷分散機能をテストできます。その他、好きなサービスや機能を追加することができます。

図 10: ターゲットグループを作成するための Amazon CodeWhisperer による提案コード

CodeWhisperer を用いて、ロードバランサーやターゲットグループを作成するスクリプトを生成しました。この要領で、他のリソースを追加したり、デタッチしたりすることもできます。

4. コマンドラインからのスクリプトの実行

スクリプトが完成したら、コマンドラインからスクリプトを実行できます。

図 11: コマンドラインからスクリプトを実行

ここで示したスクリプトが、ユースケースに適した完全なスクリプトではないかもしれませんが、ポイントは、Amazon CodeWhisperer によるオートコンプリートの提案を通じて、開発プロセスを加速できる、という点となります。例えば、HTTPS トラフィックの要件がある場合には、同様に Amazon CodeWhisperer を用いてスクリプトを作成するか、または「AWSDocs-Configure-SSL-TLS-AL2」などの SSM ドキュメントを使用して、起動後アクションを設定する方法もあります。

                                    import boto3

# Enter your AWS credentials here.
# You can find these credentials in the AWS Management Console.

aws_access_key_id = input("Enter the aws access key id: ")
aws_secret_access_key = input("Enter the aws secret access key: ")
region_name = input("Enter the region name: ")
# Start the session with your AWS credentials
# and the region you want to work with.

session = boto3.Session(aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name=region_name)

#Enter your Amazon EC2 instance id and subnet id here.
#You can find the instance id and subnet id in the AWS Management Console.

instance_id = input("Enter the instance id: ")
subnet_id1 = 'subnet-000000000000000'

subnet_id2 = 'subnet-000000000000000'
ec2 = boto3.client("ec2")
sg_id = 'sg-04cadfeb375c5a30e'

# Allocate a public IP address for the instance.

eip = ec2.allocate_address(Domain="vpc")

ec2.associate_address(InstanceId=instance_id, PublicIp=eip["PublicIp"])

vpc_id = ec2.describe_instances (InstanceIds=[instance_id])["Reservations"][0]["Instances"][0]["VpcId"]

#Here, you create a target group for the instance and a load balancer.
#The target group is used to route traffic to the instance.

elbv2 = boto3.client("elbv2")

target_group = elbv2.create_target_group(
Name="target-group111",
Protocol="HTTP",
Port=80,
VpcId=vpc_id,
HealthCheckProtocol="HTTP",
HealthCheckPort="80",
HealthCheckPath="/",
HealthCheckIntervalSeconds=30,
HealthCheckTimeoutSeconds=5,
HealthyThresholdCount=5,
UnhealthyThresholdCount=2,
Matcher={
"HttpCode": "200"
}
)
response = elbv2.register_targets(
TargetGroupArn=target_group["TargetGroups"][0]["TargetGroupArn"],
Targets=[
{
"Id": instance_id
}])
response = elbv2.create_load_balancer(
Name="load-balancer-xxxxxx",
Subnets=[subnet_id1,subnet_id2],
SecurityGroups=[sg_id],
Scheme="internet-facing",
Tags=[
{
"Key": "Name",
"Value": "load-balancer"
}])
#Lastly, you create a listener for the load balancer.
#The listener is used to route traffic to the target group.

elbv2.create_listener(
LoadBalancerArn=response["LoadBalancers"][0]["LoadBalancerArn"],
Protocol="HTTP",
Port=80,
DefaultActions=[
{
"Type": "forward",
"TargetGroupArn": target_group["TargetGroups"][0]["TargetGroupArn"]
}])
#You can view the output of your instance using the public IP address provided.
print(f'The public IP address of the instance is {eip["PublicIp"]}. You may now test the instance.')

5. AWS MGN にてカットオーバープロセスを完了

テストが完了したら、AWS MGN ライフサイクルの[テスト準備の完了]に戻るか、[カットオーバーの準備完了]としてマークできます。

図 12:「カットオーバーの準備完了」に進める、または「テストの準備完了」に戻す

6. Amazon Route 53 で DNS ルーティングを更新

このシリーズのパート 1 では、ブルー/グリーンデプロイにおいて Amazon Route 53 で DNS ルーティングを使用し、必要に応じてトラフィックをブルー (移行元) バージョンとグリーン (移行先) バージョンの間で切り替える方法を学びました。これには、ネットワークトラフィックを誘導するように Route 53 のエイリアスレコードを更新することが含まれます。

クリーンアップ

このブログに関連する追加料金が発生しないように、次のようなリソースを必ずクリーンアップしてください。

まとめ

このシリーズのパート 2 では、カスタマイズされた起動後アクションを作成する方法について説明しました。
また、Amazon の Generative AI を利用したコーディング支援ツールである、CodeWhisperer を利用する方法についても説明しました。様々な言語でスクリプトを作成し、AWS のリソースにサービスや機能をアタッチしたりデタッチしたりして、反復可能なテスト方法を作成するために、どのように役立つかを確認しました。

翻訳はソリューションアーキテクト 小宮山 裕樹 が担当しました。原文はこちらです。