1. ホーム
  2. 記事一覧
  3. [ハンズオン]AWS Backupで作成したAMIをLambdaを使用して起動テンプレートに適用

2024.04.06

[ハンズオン]AWS Backupで作成したAMIをLambdaを使用して起動テンプレートに適用

簡単な自動手法を学ぶ

この記事では、AWS上でのリソース管理を自動化する方法を実践的に解説します。特に、開発環境やプロダクション環境におけるデプロイメントプロセスの簡素化や、ディザスタリカバリ準備の一環として、最新のAMIを定期的に起動テンプレートに適用する自動化手法を紹介します。このガイドを通じて、手動での更新作業を削減し、システムの安定性と効率性を向上させる方法を学びます。

使用するリソース

  • AWS Backup

    定期的にAMIを作成し、データの保護と復元を可能にするサービスです。今回のハンズオンでは、Backupプランを使用して、特定のタグが付与されたAMIを定期的に作成します。

  • Lambda

    コードを実行できるサーバーレスコンピューティングサービスです。今回のハンズオンでは、Lambda関数を使用して、Backupで作成された最新のAMIを取得し、そのAMI IDを起動テンプレートに紐付けます。

  • EC2 Auto Scaling

    EC2インスタンスの数を自動的にスケーリングするサービスです。今回のハンズオン使用するのは、起動テンプレートの仕組みだけです。

  • EventBridge

    イベント駆動型コンピューティングサービスです。今回のハンズオンでは、BackupでAMI作成が完了したイベントをLambda関数に通知するために使用します。

AMIの自動バックアップ設定

1. AWS Management Consoleにログイン

AWS Management Consoleにログインし、「Services(サービス)」メニューから「Backup」を選択します。筆者はサービス名を検索しています。

2. バックアップポリシーの作成

AWS Backupのダッシュボードで、左ペインから「Backup plans(バックアッププラン)」を選択し、オレンジ色のボタン「Create backup plan(バックアッププランを作成)」をクリックします。 次にバックアッププランの作成方法として、「Build a new plan(新しいプランを立てる)」を選びます。 「Plan name(プラン名)」バックアッププランにわかりやすい名前を付けます。

3. バックアッププランの設定

「Backup rule configuration(バックアップルールの設定画面)」が表示されるので、次のように入力していきます。

  • 「Backup Rule name(バックアップルール名)」バックアップルールに名前を付け、バックアップの実行スケジュールや保持期間などを設定します。

    • 「バックアップボールト」で「新しいバックアップボールトを作成」をクリックし、新しく開いたタブで「バックアップボールト名」をつけます。
      • 暗号化キーは「(デフォルト)aws/backup」を選択し、「バックアップボールとを作成」ボタンを押下します。今回その他は入力しません。
    • 「バックアップルールの設定」画面に戻り、「バックアップボールト」に先ほど作成したものを選択します。
      • 「Schedule(バックアップ期間)」バックアップの実行頻度を設定します(例:毎日、毎週など)。今回は検証なのでデフォルトのままとします。
        • 「Start time(開始時間)」バックアップを開始する時間帯を設定します。
        • 「Backup within(次の時間以内に開始)」指定された時間に実施されない場合にバックアップを開始する時間を設定します。
        • 「Completion window(完了ウィンドウ)」バックアップの完了期限を設定します。
      • 「Point-in-time reccovery(ポイントインタイムリカバリ)」特定の時点までデータを復元する機能です。今回はチェックしません。
      • 「Lifecycle(ライフサイクル)」バックアップの保持期間を設定します。保持期間が過ぎると、バックアップは自動的に削除されます。こちらもデフォルトのままとします。
    • 「Tags added to recovery points (復旧ポイントに追加されたタグ)」わかりづらい日本語ですが、こちらに新しいタグを追加します。Keyは「Backup」Valueは「daily」などをつけてください。

    • これ以外は、今回の検証では使わないためデフォルトのままです。
  • 「Create plan(プランを作成)」をクリックします。

4. リソースの選択とバックアッププランの適用

バックアッププランが作成された後、作成したプランを選択し、「Assign resources(リソースを割り当て)」をクリックします。そしてバックアッププランを適用するリソースを選択します。

  • 「Resource assignment name(リソース割り当て名)」割り当てに名前を付けます。

  • 「IAM role(IAMロール)」デフォルトとします。

  • 「Resource selection(リソースの選択)」セクション

    • 「Resource assignment(リソースの割り当て)」特定のリソースを選択するか、タグを使用してリソースを自動的に選択する方法を指定します。
      • 「Resource type(リソースタイプ)」「EC2」を選択します。
  • 設定が完了したら、「Assign resources(リソースを割り当て)」をクリックして設定を保存します。

これで、選択したEC2インスタンスに対して定期的なバックアップが自動的に作成されるようになります。AWS Backupを使用することで、EC2インスタンスやEBSボリュームなどのAWSリソースのバックアップ管理が簡単になり、災害復旧計画の一環として活用できます。

AWS Lambda関数を作成して、特定のタグが付いた最新のAMIを検索し、それを使用して起動テンプレートを更新するプロセスは以下のように進められます。ここでは、Pythonを使用したLambda関数の基本的な例を示します。

起動テンプレートを更新するLambdaを作成

特定のタグが付いた最新のAMIを検索し、それを使用して起動テンプレートを更新するLambdaを作成します。

1: Lambda関数の作成

  1. AWS Management Consoleにログインします。
  2. 「Services」から「Lambda」を選択し、「Create function(関数を作成)」をクリックします。
  3. 「Author from scratch(新規作成)」を選択します。
  4. 関数名に適当な名前を入力し(例: UpdateLaunchTemplateWithLatestAMI)、ランタイムに「Python 3.12」を選択します。
  5. 「Change default execution role(デフォルト実行ロールを変更)」を選択し、「Create a new role with basic Lambda permissions(基本的なLambda権限で新しいロールを作成)」を選択します。
  6. 「Create function(関数を作成)」をクリックします。

2: IAMロールの権限設定

Lambda関数には、AMIを検索し、起動テンプレートを更新するための権限が必要です。これを実現するために、Lambda関数に割り当てられたIAMロールに以下のポリシーを追加します。

  1. AWS Management Consoleで「IAM」を開きます。
  2. 「Roles(ロール)」を選択し、Lambda関数で使用するロールを選択します。
  3. 「Attach policies(ポリシーをアタッチ)」をクリックし、「AmazonEC2ReadOnlyAccess」および「AmazonEC2FullAccess」を検索して追加します。(実際の運用では、必要最小限の権限のみを付与することを推奨します。)

ステップ 3: Lambda関数のコーディング

以下は、特定のタグが付いた最新のAMIを検索し、起動テンプレートを更新するLambda関数の例です。

import boto3 # boto3ライブラリをインポート。AWSのサービスをPythonから使うためのSDKです。
import os # osモジュールをインポート

def lambda_handler(event, context): # Lambda関数のメイン関数。AWSからイベントとコンテキストが渡されます。
    ec2 = boto3.client('ec2') # boto3を使ってEC2サービスのクライアントを作成します。

    # 最新のAMIを見つけるためにdescribe_imagesを呼び出し。所有者を自分自身に限定し、特定のタグでフィルタリングします。
    amis = ec2.describe_images(Owners=['self'], Filters=[{'Name': 'tag:YourTagName', 'Values': ['YourTagValue']}])
    # 取得したAMIのリストを作成日時で降順にソートします。最新のAMIがリストの最初に来ます。
    amis = sorted(amis['Images'], key=lambda x: x['CreationDate'], reverse=True)
    latest_ami_id = amis[0]['ImageId'] # ソート済みリストの最初の要素(最新のAMI)のIDを取得します。
    
    # 起動テンプレートを更新するためにcreate_launch_template_versionを呼び出します。
    # 環境変数から起動テンプレートのIDを取得
    launch_template_id = os.getenv('LAUNCH_TEMPLATE_ID')
    response = ec2.create_launch_template_version(
        LaunchTemplateId=launch_template_id,
        SourceVersion='$Latest', # ソースバージョンとして最新を指定。
        LaunchTemplateData={
            'ImageId': latest_ami_id, # 新しいAMI IDを起動テンプレートに設定。
        }
    )
    
    # 新しい起動テンプレートバージョンをデフォルトバージョンに設定します。
    latest_version_number = response['LaunchTemplateVersion']['VersionNumber']
    ec2.modify_launch_template(
        LaunchTemplateId=launch_template_id,
        DefaultVersion=str(latest_version_number) # 最新バージョンをデフォルトに設定。
    )

タグ名と値のカスタマイズ

上記のLambda関数では、YourTagNameYourTagValueというプレースホルダーを使用しています。これらは、実際に自分のAWS環境で使用しているAMIに適用されたタグの名前と値に置き換える必要があります。例えば、AMIに「Project」という名前のタグがあり、その値が「MyApplication」である場合、コード内のYourTagNameProjectに、YourTagValueMyApplicationにそれぞれ置き換えます。

環境変数の設定

上記のLambda関数では、LAUNCH_TEMPLATE_IDという環境変数を使用して起動テンプレートのIDを参照しています。この環境変数は、Lambda関数を作成または編集する際にAWS Lambdaコンソールから設定する必要があります。

  1. Lambda関数のページで、「Configuration(設定)」タブを選択します。
  2. 「Environment variables(環境変数)」セクションを見つけ、「Edit(編集)」をクリックします。
  3. 「Key(キー)」フィールドにLAUNCH_TEMPLATE_IDと入力し、「Value(値)」フィールドに起動テンプレートのIDを入力します。
  4. 「Save(保存)」をクリックして変更を適用します。

これらの設定を適切に行うことで、Lambda関数は正しいタグを持つAMIを識別し、指定された起動テンプレートを更新することができます。

スケジュールに沿ってLambdaを実行する

AWS EventBridge(以前のCloudWatch Events)を使用して、AWS Lambda関数を定期的に自動実行するスケジュールを設定します。

EventBridgeでLambda関数をトリガーする手順

AWS Management Consoleにログインします。

  • 「Services(サービス)」から「EventBridge(イベントブリッジ)」を選択します。
    • 左側のナビゲーションバーから「Rules(ルール)」を選択し、「Create rule(ルールを作成)」をクリックします。
      • 「Rule configuration(ルールの設定)」で、Ruleに名前をつけ、任意の説明を追加します。
      • 「Define pattern(パターンの定義)」で「Schedule(スケジュール)」を選択し、特定のスケジュールを設定します。例えば、「Cron expression(クロン式)」を使用して毎日特定の時間に実行されるように設定できます。
      • 「Select targets(ターゲットを選択)」で「Lambda function(Lambda関数)」を選択し、トリガーするLambda関数を指定します。

この手順により、AWS EventBridgeを使用して、指定したスケジュールに基づいてAWS Lambda関数を定期的に自動実行するルールを設定することができます。この機能は、バッチ処理や定期的なデータ処理、インフラストラクチャの自動管理など、多くの自動化シナリオで有用です。

検証とクリーンアップ

構成の検証プロセスは、システムが設計通りに機能することを確認するために重要です。以下に、AWS BackupでAMIを自動的に作成し、タグ付けし、その後Lambda関数を使用して起動テンプレートを更新するプロセスの検証手順を示します。

AWS BackupでのAMIのバックアップとタグ付けの確認

  1. AWS Backupを使用してバックアップジョブを実行

    • バックアップが成功したかAWS Backupのダッシュボードで確認します。
    • バックアップジョブが成功し、対象のEC2インスタンスからAMIが作成されたことを確認します。
  2. 作成されたAMIにタグが適切に付与されていることを確認

    • AWS Management ConsoleのEC2ダッシュボードで、「AMIs」セクションを確認し、新しく作成されたAMIを探します。
    • AMIに予定通りのタグが付いていることを確認します。このタグは、後のLambda関数でAMIを識別するのに使用されます。

Lambda関数の実行と起動テンプレートの更新の確認

  1. Lambda関数を手動で実行するか、EventBridgeルールに基づいて自動実行されるのを待つ

    • Lambda関数が正常に実行されたか、Lambdaコンソールの「Monitoring(モニタリング)」タブで確認します。
    • Lambda関数のログ出力を確認し、処理の詳細と結果を見ます(CloudWatch Logsで確認できます)。
  2. Lambda関数によって起動テンプレートが更新されたことを確認

    • EC2ダッシュボードで、「Launch Templates(起動テンプレート)」セクションを確認し、対象の起動テンプレートを選択します。
    • 「Versions(バージョン)」タブで、新しく作成されたバージョンがあること、およびそのバージョンがデフォルトに設定されていることを確認します。
    • 新しいバージョンの起動テンプレートが、Lambda関数で指定された最新のAMIを使用していることを確認します。

検証の完了

以上を通じて、AWS BackupでのAMIの自動作成とタグ付け、Lambda関数を使用した起動テンプレートの自動更新が期待通りに機能することを確認できます。これにより、EC2インスタンスのデプロイメントプロセスの自動化と最適化が実現されます。検証プロセス中に問題が発見された場合は、設定やコードを見直し、問題が解決するまでデバッグを行います。

クリーンアップ手順

今回はハンズオンでしたので、余計な料金が発生しないように、検証の終わったリソースは次の手順で削除しておきます。間違って違うリソースを削除してしまわないよう、慎重に実施してください。声出し、指さしをしたとしても集中できていないと間違ってしまうのが人間です。

  • AWS Backupからのバックアップの削除

    AWS Management Consoleにログインし、「Backup」サービスへ移動します。 不要になったバックアップジョブを選択し、「Delete(削除)」を実行します。

  • 不要になったAMIの削除

    EC2ダッシュボードで、「AMIs」セクションに移動します。 不要になったAMIを選択し、「Actions(アクション)」から「Deregister(登録解除)」を選択します。必要に応じて関連するスナップショットも削除します。

  • Lambda関数の削除

    Lambdaコンソールに移動し、不要になったLambda関数を選択します。 「Actions(アクション)」から「Delete(削除)」を選択して関数を削除します。

  • EventBridgeのルール削除

    EventBridgeコンソールに移動し、「Rules(ルール)」セクションから不要になったルールを選択します。 「Delete(削除)」をクリックしてルールを削除します。

  • 使用したIAMロールの削除:

    IAMコンソールに移動し、このプロジェクトで使用したIAMロールを選択します。

学んだこと・できるようになったこと

このハンズオンプロジェクトでは、AWSのサービスを組み合わせて、効率的かつ自動化された EC2 インスタンスのバックアップとデプロイメントの仕組みを構築しました。

  1. AMI のバックアップ自動化

    • AWS Backup を使用して、定期的に EC2 インスタンスの AMI を自動的に作成しバックアップ
  2. AMI の管理自動化

    • Lambda 関数を使用して、特定のタグが付いた最新の AMI を管理
    • EventBridge によって、定期的な AMI の管理プロセスを自動実行
  3. 起動テンプレートの自動更新

    • 上記で管理された最新の AMI を使用して、起動テンプレートを自動的に更新

この一連の仕組みにより、EC2 インスタンスの管理とデプロイメントが効率化・自動化されました。また、ビジネスの継続性計画やディザスタリカバリ戦略の一環としても活用できます。ハンズオン終了時には、不要なリソースをクリーンアップすることで、コスト削減とセキュリティの向上にも寄与しました。以上で、AWSのさまざまなサービスを組み合わせて活用する経験を通じ、その便利さと柔軟性を理解することができました。

最大のメリットとしては、自動化をすることで自分の空き時間を作ることができますので、さらなるスキル研鑽に励むことができます。そして、自動化を実現するには、他にもさまざまなアプローチがあります。今回のハンズオンで学んだことを実務に活かせるよう工夫してみてください。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事