Amazon EC2 でウェブアプリケーションをデプロイする
入門ガイド
モジュール 2: 設定の自動化
このモジュールでは、ユーザーデータを使用して EC2 インスタンスを設定し、EC2 インスタンスにソフトウェアパッケージをインストールする方法を説明します
はじめに
Amazon EC2 でインスタンスを起動するとき、共通の自動化された設定タスクの実行に使用できるインスタンスにユーザーデータを渡し、インスタンスがスタートした後にスクリプトを実行することもできます。この機能を使用して、どのソフトウェアをインストールして最初の起動時に設定するかを指定することにより、アプリケーションデプロイを簡素化し、インスタンスにサンプルアプリケーションをコピーします。このモジュールは、ユーザーデータを作成し、それを以前のモジュールで作成した EC2 インスタンスに追加する方法を説明します。
学習内容
- ユーザーデータを EC2 インスタンスに追加する方法
- ユーザーデータを作成して OS 上で必要な全てのパッケージをインストールおよび設定する
- インスタンスにウェブアプリケーションをコピーすることによりデプロイする
所要時間
5 分
モジュールの前提条件
- 管理者レベルのアクセス権を持つ AWS アカウント**
- 推奨ブラウザ: Chrome または Firefox の最新バージョン
[**] 過去 24 時間以内に作成されたアカウントは、このチュートリアルに必要なサービスへのアクセス権限がまだ付与されていない可能性があります。
実装
EC2 インスタンスにユーザーデータを追加する
SampleApp フォルダにホストされたサンプルウェブアプリケーションは、これからデプロイする Python アプリケーションです。これには、実行する Nginx と uWSGI が必要です。これらのコンポーネントをインストールするステップはたくさんあります。まず、全ての OS パッケージをインストールし、nginx と uwsgi を設定し、これらが稼働していることを確認し、サンプルアプリケーションをインスタンスにコピーする必要があります。これらのセットアップステップの全てを設定するスクリプトファイルは、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 スタックのデプロイ