AWS Elastic Beanstalk でウェブアプリケーションをデプロイする

入門ガイド

モジュール 2: AWS CDK を使用してインフラストラクチャを作成する

このモジュールでは、Elastic Beanstalk を使用して NodeJS ウェブアプリケーションをデプロイするために必要なすべてのインフラストラクチャを作成する CDK アプリケーションを作成します。

はじめに

このモジュールでは、AWS Elastic Beanstalk を使用して NodeJS ウェブアプリケーションをデプロイするために必要なすべてのインフラストラクチャを作成する CDK アプリケーションを作成します。

学習内容

  • 簡単な CDK アプリケーションを作成する
  • S3 アセットを使用してパッケージを S3 にアップロードする
  • Elastic Beanstalk CDK アプリケーション、アプリケーションバージョン、および環境を作成する

 所要時間

15 分

 モジュールの前提条件

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

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

実装

CDK アプリケーションを作成する

最新の CDK バージョンを使用していることを確認してください。

npm install -g cdk

新しいディレクトリを作成し、それを開きます

mkdir cdk-eb-infra
cd cdk-eb-infra

インフラストラクチャの実行に使用する CDK アプリケーションを初期化します。

cdk init app --language typescript

リソーススタックのコードを作成する

ファイル /lib/cdk-eb-infra-stack.ts に移動し、そこに作成するリソーススタックのコードを書き込みます。 

リソーススタックは、特定のアカウントへプロビジョンされる、クラウドインフラストラクチャリソースのセットです (これらが全て AWS リソースになる特別なケースもあり)。これらのリソースがプロビジョニングされるアカウントは、前提条件の手順で設定したスタックです。このリソーススタックでは、次のリソースを作成します。

  • S3 アセット: これは、zip 形式のアプリケーションを S3 にアップロードするのに役立ち、CDK アプリケーションにオブジェクトの場所を取得する方法を示します。
  • Elastic Beanstalk アプリケーション: これは、環境、バージョン、環境設定など、Elastic Beanstalk コンポーネントの論理的なコレクションです。
  • Elastic Beanstalk アプリケーションのバージョン: これは、ウェブアプリケーションのデプロイ可能なコードの特定のラベル付き反復を指します。アプリケーションバージョンは、デプロイ可能なコード (この場合は S3 アセットを使用して S3 にアップロードする zip ファイル) を含む Amazon Simple Storage Service (Amazon S3) オブジェクトを指します。アプリケーションには多くのバージョンがあり、各アプリケーションバージョンは一意です。
  • インスタンスプロファイルとロール: これは、AWS Identity and Access Management (IAM) ロールのコンテナであり、インスタンスの起動時にロール情報を Amazon EC2 インスタンスに渡すために使用できます。
  • Elastic Beanstalk 環境: これは、アプリケーションバージョンを実行している AWS リソースのコレクションです。各環境は、一度に 1 つのアプリケーションバージョンのみを実行します。

アプリケーションを S3 に自動的にアップロードする

ウェブアプリケーションをデプロイするには、Elastic Beanstalk がそのアプリケーションを環境にデプロイするために、パッケージ化して Amazon Simple Storage Service (S3) にアップロードする必要があります。

このガイドのモジュール 3 でアプリケーションのパッケージ化を行いますが、ここでは S3 へのアップロードに焦点を当てます。そのためには、S3 アセットと呼ばれる CDK コンストラクターを使用します。このモジュールは、ローカルファイルとディレクトリを S3 にアップロードします。

CDK アプリケーションでこれを行うには、最初に aws-s3-assets モジュールをインストールする必要があります。

npm i @aws-cdk/aws-s3-assets

続いて、lib/cdk-eb-infra-stack.ts ファイルの先頭に依存関係を追加します。

import s3assets = require('@aws-cdk/aws-s3-assets');

スタック内の「スタックを定義するコードをここに追加」というコメント行の下に、次のコードを追加します。

 // Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
      path: `${__dirname}/../app.zip`,
});

このコードは S3 アセットモジュールを使用し、CDK アプリケーションのルートにあるウェブアプリケーションの zip ファイルを取得して S3 にアップロードします。zip ファイルを更新してこのスタックをデプロイすると、ファイルは S3 で更新されます。

Elastic Beanstalk CDK の依存関係を追加する

Elastic Beanstalk アプリケーション、アプリケーションバージョン、および環境を作成して、S3 アセットを使用して S3 にアップロードしたばかりのウェブアプリケーションをデプロイできるようにします。

まず、CDK 用の Elastic Beanstalk モジュールをインストールする必要があります。

npm i @aws-cdk/aws-elasticbeanstalk

次に、依存関係を /lib/cdk-eb-infra-stack.ts ファイルの先頭に追加します。

import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');

Elastic Beanstalk アプリケーションを作成する

これで、Elastic Beanstalk アプリケーションを作成できます。前述のように、Elastic Beanstalk アプリケーションは、フォルダのような Elastic Beanstalk コンポーネントの論理コレクションです。

このコードを S3 アセットのコードの下に置きます。このコードは、Elastic Beanstalk に MyWebApp という名前のアプリケーションを作成します。

// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
    applicationName: appName,
});

Elastic Beanstalk アプリケーションバージョンを作成する

次に、先に作成した S3 アセットからアプリケーションバージョンを作成する必要があります。このコードは、S3 アセットと CDK がこのメソッドに提供する S3 バケット名と S3 オブジェクトキーを使用してアプリケーションバージョンを作成します。

// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
    applicationName: appName,
    sourceBundle: {
        s3Bucket: webAppZipArchive.s3BucketName,
        s3Key: webAppZipArchive.s3ObjectKey,
    },
});

先に進む前に、アプリケーションのバージョンを作成する前に Elastic Beanstalk アプリケーションが存在することを確認する必要があります。これは、CDK で非常に簡単に行えます。

// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);

インスタンスプロファイルを作成する

Elastic Beanstalk 環境を作成するには、既存のインスタンスプロファイル名を指定する必要があります。

インスタンスプロファイルは、AWS Identity and Access Management (IAM) ロールのコンテナであり、インスタンスの起動時にロール情報を Amazon EC2 インスタンスに渡すために使用できます。

この場合、ロールはマネージドポリシー (AWSElasticBeanstalkWebTier) をアタッチします。このポリシーは、ログを Amazon S3 にアップロードし、デバッグ情報を AWS X-Ray にアップロードするためのアクセス許可をアプリケーションに付与します。

最初に行う必要があるのは、CDK アプリケーションに IAM モジュールをインストールすることです。

npm i @aws-cdk/aws-iam

続いて、次のように、作業中の CDK スタックに依存関係をインポートします。

import iam = require('@aws-cdk/aws-iam');

アプリケーションバージョンを作成するコードの後に、次のコードを追加できます。

// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
    assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});

const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);

const myProfileName = `${appName}-InstanceProfile`

const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
    instanceProfileName: myProfileName,
    roles: [
        myRole.roleName
    ]
});

コードが最初に行うことは、新しい IAM ロール (myRole) を作成することです。

ご使用の環境の EC2 インスタンスがロールを引き受けることができるように、インスタンスプロファイルは Amazon EC2 を信頼関係ポリシーの信頼できるエンティティとして指定します。

次に、そのロールにマネージドポリシー AWSElasticBeanstalkWebTier を追加し、そのロールとプロファイル名を使用してインスタンスプロファイルを作成します。

Elastic Beanstalk 環境を作成する

最後に作成する必要があるのは、Elastic Beanstalk 環境です。この環境は、アプリケーションバージョンを実行している AWS リソースのコレクションです。環境については、インフラストラクチャ情報を提供する必要があります。

環境を作成することから始めましょう。環境を作成するときは、Elastic Beanstalk コンソールに表示される名前を付ける必要があります。この場合、環境に MyWebAppEnvironment という名前を付けています。

次に、以前に Elastic Beanstalk アプリケーション定義から取得したアプリケーション名を指定する必要があります。

ソリューションスタック名は、Elastic Beanstalk がウェブアプリケーションを実行するために指定するマネージドプラットフォームの名前です。適切なソリューション名を使用すると、Elastic Beanstalk は、アプリケーションに適切なリソース (Amazon Elastic Compute Cloud (Amazon EC2) インスタンスなど) をプロビジョニングします。ウェブアプリケーションの開発に選択したフレームワークとプラットフォームに応じて、適切なソフトウェアスタックを選択する必要があります。この特定のケースでは、この文字列「64bit Amazon Linux 2 v5.4.4 running Node.js 14」を入力します。この文字列のソースに関心がある場合は、このモジュールの最後にソリューションスタック名に関する詳細情報があります。

オプション設定属性により、Elastic Beanstalk 環境をニーズに合わせて設定できます。

  • IamInstanceProfile: ここでは、前の手順で作成したインスタンスプロファイルを参照します。
  • MinSize、MaxSize、InstanceTypes: これらは、Elastic Beanstalk が生成するインスタンスと Auto Scaling グループの設定です。これらはオプションのパラメータです。設定しない場合、Elastic Beanstalk は、プラットフォーム定義に従って、インスタンスタイプと Auto Scaling グループの最小サイズと最大サイズを選択します。AWS 無料利用枠 内にとどまることができるようにそれらを定義しています。

Elastic Beanstalk の設定オプションに関する詳細情報

これらすべての設定オプションを定義するには、次のコード行を追加します。

// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
    {
        namespace: 'aws:autoscaling:launchconfiguration',
        optionName: 'IamInstanceProfile',
        value: myProfileName,
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MinSize',
        value: '1',
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MaxSize',
        value: '1',
    },
    {
        namespace: 'aws:ec2:instances',
        optionName: 'InstanceTypes',
        value: 't2.micro',
    },
];

最後に、バージョンラベルがあります。これは、作成したばかりのアプリケーションバージョンへの参照である必要があるため、重要な属性です。

これらすべての情報を使用して、Elastic Beanstalk 環境を作成できます。

このコードをスタック定義ファイルに貼り付けます。

// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
    environmentName: 'MyWebAppEnvironment',
    applicationName: app.applicationName || appName,
    solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
    optionSettings: optionSettingProperties,
    versionLabel: appVersionProps.ref,
});

よくある間違い

複数のバージョンの CDK ライブラリを使用する

CDK を使用するときに発生する可能性のある一般的なエラーの 1 つは、ライブラリをインポートしてアプリケーションで使用を開始すると、「this」という単語が強調表示され、コンパイルの問題が発生する可能性があることです。

gsg_build_elb_1

これは、CDK コアライブラリとは異なるバージョンの CDK モジュールを使用しているために発生する可能性があります。CDK は頻繁に更新されるため、非常に一般的なエラーです。

これを修正するには、すべての cdk パッケージを同じバージョンに更新する必要があります。CDK パッケージのバージョンは、CDK アプリケーションの package.json ファイルで確認できます。

gsg_build_elb_2

詳細情報

Elastic Beanstalk ソリューションスタック名に関する詳細情報

ドキュメントでは、Elastic Beanstalk でサポートされているすべてのプラットフォームについて読むことができます。このページは、新しいプラットフォームが追加され、古いプラットフォームが廃止されるたびに更新され続けます。

適切なプラットフォーム名を取得する方法に興味がある場合 - 例: 64bit Amazon Linux 2 v5.4.4 running Node.js 14。AWS CLI を使用して、サポート対象のすべてのプラットフォームのリストを取得できます

aws elasticbeanstalk list-available-solution-stacks

これにより、CDK アプリケーションで使用できるサポートされているプラットフォーム文字列の長いリストが返されます。

まとめ

このモジュールでは、アプリケーションを自動的にデプロイするために Elastic Beanstalk に必要なすべてのリソースを作成する方法を説明しました。次のモジュールでは、クラウドにデプロイする方法と、変更があった時に、アプリケーションをアップデートする方法を説明します。

次回: アプリケーションをデプロイする

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

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