Amazon EC2 でウェブアプリケーションをデプロイする

入門ガイド

モジュール 2: 設定の自動化

このモジュールでは、ユーザーデータを使用して EC2 インスタンスを設定し、EC2 インスタンスにソフトウェアパッケージをインストールする方法を説明します

はじめに

Amazon EC2 でインスタンスを起動するとき、共通の自動化された設定タスクの実行に使用できるインスタンスにユーザーデータを渡し、インスタンスがスタートした後にスクリプトを実行することもできます。この機能を使用して、どのソフトウェアをインストールして最初の起動時に設定するかを指定することにより、アプリケーションデプロイを簡素化し、インスタンスにサンプルアプリケーションをコピーします。このモジュールは、ユーザーデータを作成し、それを以前のモジュールで作成した EC2 インスタンスに追加する方法を説明します。

学習内容

  • ユーザーデータを EC2 インスタンスに追加する方法
  • ユーザーデータを作成して OS 上で必要な全てのパッケージをインストールおよび設定する
  • インスタンスにウェブアプリケーションをコピーすることによりデプロイする

 所要時間

5 分

 モジュールの前提条件

  • 管理者レベルのアクセス権を持つ AWS アカウント**
  • 推奨ブラウザ: Chrome または Firefox の最新バージョン

[**] 過去 24 時間以内に作成されたアカウントは、このチュートリアルに必要なサービスへのアクセス権限がまだ付与されていない可能性があります。

実装

EC2 インスタンスにユーザーデータを追加する

SampleApp フォルダにホストされたサンプルウェブアプリケーションは、これからデプロイする Python アプリケーションです。これには、実行する NginxuWSGI が必要です。これらのコンポーネントをインストールするステップはたくさんあります。まず、全ての OS パッケージをインストールし、nginxuwsgi を設定し、これらが稼働していることを確認し、サンプルアプリケーションをインスタンスにコピーする必要があります。これらのセットアップステップの全てを設定するスクリプトファイルは、SampleApp/configure_amz_linux_sample_app.sh に提供されます。インスタンスがどのように設定されるかについて詳しく知りたい方は、スクリプトフィアルに書かれているステップをご確認ください。

ウェブアプリケーションをデプロイするには、設定ファイルとスクリプトをコピーする CDK にコードを、S3 にサンプルアプリケーションを追加する必要があります。設定ファイルを設定します。そのためには、以下の ec2-cdk-stack.ts のコードを以前のコードの下に追加します。

// Use an asset to allow uploading files to S3, and then download it to the EC2 instance as part of the user data

    // --- Sample App ---
    // Upload the sample app  to S3
    const sampleAppAsset = new s3assets.Asset(this, "SampleAppAsset", {
      path: path.join(__dirname, "../../SampleApp"),
    });

    // Allow EC2 instance to read the file
    sampleAppAsset.grantRead(role);

    // Download the file from S3, and store the full location and filename as a variable
    const sampleAppFilePath = ec2Instance.userData.addS3DownloadCommand({
      bucket: sampleAppAsset.bucket,
      bucketKey: sampleAppAsset.s3ObjectKey,
    });

    // --- Sample App ---

    // --- Configuration Script ---
    // Upload the configuration file to S3
    const configScriptAsset = new s3assets.Asset(this, "ConfigScriptAsset", {
      path: path.join(__dirname, "../../SampleApp/configure_amz_linux_sample_app.sh"),
    });

    // Allow EC2 instance to read the file
    configScriptAsset.grantRead(ec2Instance.role);

    // Download the file from S3, and store the full location and filename as a variable
    const configScriptFilePath = ec2Instance.userData.addS3DownloadCommand({
      bucket: configScriptAsset.bucket,
      bucketKey: configScriptAsset.s3ObjectKey,
    });

    // Add a line to the user data to executy the downloaded file
    ec2Instance.userData.addExecuteFileCommand({
      filePath: configScriptFilePath,
      arguments: sampleAppFilePath,
    });

    // --- Configuration Script ---

全てのステップがインスタンスのユーザーデータスクリプトに追加され、初回起動時に実行されます。全てをデプロイする前にもう 1 ステップあります。アウトプットを CDKスタックに追加してインスタンスへの SSH を簡単にします。上記のインフラストラクチャでは、SSH キーを作成しました。これは、AWS Secret Manager に保存されます。これをワークステーションにダウンロードするには、これを取得しなければなりません。また、インスタンスのパブリック IDと実行する SSHコマンドも必要です。 

以下のコードを最下部のスタックに追加します。

// Create outputs for connecting

    // Output the public IP address of the EC2 instance
    new cdk.CfnOutput(this, "IP Address", {
      value: ec2Instance.instancePublicIp,
    });

    // Command to download the SSH key
    new cdk.CfnOutput(this, "Download Key Command", {
      value:
        "aws secretsmanager get-secret-value --secret-id ec2-ssh-key/cdk-keypair/private --query SecretString --output text > cdk-key.pem && chmod 400 cdk-key.pem",
    });

    // Command to access the EC2 instance using SSH
    new cdk.CfnOutput(this, "ssh command", {
      value:
        "ssh -i cdk-key.pem -o IdentitiesOnly=yes ec2-user@" +
        ec2Instance.instancePublicIp,
    });

これら 3 つのアウトプットから以下が分かります。

  • SSH キーをダウンロードしてインスタンスにアクセスする方法
  • インスタンスのパブリック IP
  • インスタンスにアクセスするための SSH コマンド

これでスタックのデプロイをする準備ができました。

まとめ

このモジュールでは、ユーザーデータを EC2 インスタンスに追加し、最初の起動時に、これを設定する許可を付与する方法を説明しました。これを使用して、全ての依存関係をインストールし、nginx と uwsgi を設定し、サンプルアプリケーションをデプロイしました。次のモジュールでは、スタックをデプロイしサンプルアプリケーションをデプロイします。

次回: CDK スタックのデプロイ

当社のサービスについてご意見をお聞かせください。

フィードバックありがとうございます。
このページがお役に立てれば幸いです。今後の改善のために、追加の詳細情報を共有していただけますか?
閉じる
フィードバックありがとうございます。
このページがお役に立たず申し訳ありません。今後の改善のために、追加の詳細情報を共有していただけますか?
閉じる