Amazon Web Services ブログ
LAMP ベースの多層ウェブアプリケーションを AWS Snowball Edge にデプロイする
遠隔地でアプリケーションを構築していて、モニタリングカメラや検出システムなど、ローカルで生成されたデータに基づいて処理および決定を行う必要があるころを想像してみてください。ネットワークのレイテンシーが長い場合、このようなアプリケーションをクラウドで実行してデータをリアルタイムで処理することはできません。
また、災害から復旧する状況で作業していることもあるでしょう。この場合、クラウドでデータを転送し、処理するのに十分な帯域幅がない可能性があります。また、コンピューティング、ストレージ、ネットワーク、アプリケーションを短時間でデプロイするという制約も加わります。インターネット接続が利用できない場合は、オフラインで実行し、ネットワーク接続が利用できるようになったときにデータをクラウドと同期できるはずです。
AWS Snowball Edge はローカル環境とクラウド間でデータ転送が行える高耐久化されたエッジコンピューティングソリューションです。これは、ネットワークに断続的に接続または切断された環境でコンピューティングインスタンスを実行するのに利用できます。Snowball Edge の運用に必要なインフラストラクチャは最低限でよく、特に専用のデータセンターは必要ありません。Snowball Edge では、さまざまな vCPU とメモリオプションを備えた Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを作成し、アプリケーションをホストできます。これらのユニークな機能により、Snowball Edge は前述のユースケースの理想的なソリューションになっています。
このブログ記事では、Snowball Edge で EC2 インスタンスを起動し、ウェブアプリケーションを起ち上げる方法を詳しく見ていきます。Apache、MySQL、PHP (LAMP)、および人気のあるコンテンツ管理システム (CMS) である Drupal をインストールします。Drupal の動画モジュールを活用して、ここで説明したメディアワークフローの一部を実装できます。このモジュールにより、動画を任意の形式でアップロードし、動画を H.246、Theora、VP8 (ウェブ互換形式) にトランスコードし、サムネイルを作成できます。動画モジュールは、Amazon Simple Storage Service (Amazon S3) を活用するクラウドトランスコーディングサービスである Zencoder、またはサーバーでオープンソースの FFMPEG を使用します。
AWS Snowball Edge の機能
Snowball Edge により、さまざまな vCPU およびメモリオプションを備えた EC2 インスタンスを作成し、アプリケーションをホストできます。Amazon Elastic Block Storage (Amazon EBS) ボリュームを介して、ローカルストレージが備わります。Snowball Edge は、ネットワークファイルサービス (NFS) とともに、Amazon S3 エンドポイントを使ったデータの取り込みをサポートしています。Snowball Edge は、組み込みの AWS IoT Greengrass フレームワークを使用してサーバーレスの AWS Lambda 関数を実行することもできます。
Snowball Edge の EC2 インスタンスでは、現時点で次のゲストオペレーティングシステム (OS) バージョンをサポートしています。
他の OS バージョンのサポートは順次追加していきます。クラウドの Amazon EC2 インスタンスとは異なり、Snowball Edge はライセンスサーバーを提供せず、お客様のライセンスを管理できません。 このため、ライセンス管理が必要な OS を使用するには、ご自身のライセンスを持ち込む必要があります。
Snowball Edge の注文プロセス
Snowball Edge でコンピューティングインスタンスを使用するには、ジョブを作成し、AMI を指定します。これは、AWS Snowball コンソール、AWS Command Line Interface (AWS CLI)、または AWS SDK のいずれかを使って行えます。通常、次の手順に従って実行します。
- AWS マネジメントコンソールにログインします。マニュアルに記載された手順に従い、Amazon マシンイメージ (AMI) を作成し、Snowball Edge の注文に追加します。AMI は、VM Export/Import を使用して作成することもできます。
- 配送業者から Snowball Edge デバイスを受け取ります。
注意: ご利用環境に十分なインターネット接続がない場合は、必要なソフトウェアパッケージをすべて事前にインストールしてください。そのパッケージには、たとえば Apache、MySQL、PHP、Drupal などがあります。AMI を作成する前に、ソフトウェアパッケージが必要です。
全体的なアーキテクチャ
次の図は、デプロイの全体的なアーキテクチャを示しています。Snowball Edge は、ウェブサーバーとデータベースサーバーを実行します。これらのサーバーは、バックエンドデータベース層をウェブ層から分離するための独自のセキュリティグループを持っています。cron を使って定期的なバックアップジョブを実行してデータベースをダンプし、Snowball Edge 上の S3 バケットにコピーできます。このデータは、災害対策のスタンバイユニットとして機能する 2 つ目の Snowball Edge デバイスの S3 バケットにコピーできます。
Snowball Edge サイトの準備
1. Snowball Edge をご希望の場所にインストールし、電源ケーブルとネットワークケーブルを接続します。ネットワーク接続には、組み込みの RJ45 または SFP を使用できます。
2. ワークステーションから Snowball Edge デバイスへのネットワークポートを開く必要があります。Snowball Edge にデプロイするアプリケーションにアクセスするには、追加のポートが必要になる場合があります。
# | ポート (TCP) | サービス |
1 | 8080 | S3 の HTTP エンドポイント |
2 | 8443 | S3 の HTTPS エンドポイント |
3 | 8243 | EC2 の HTTPS エンドポイント |
4 | 8008 | EC2 の HTTP エンドポイント |
5 | 22 | 管理/診断 |
6 | 9091 | アクティベーション |
3. 管理ディスプレイがある Snowball Edge のフロントパネルで、電源ボタンを押します。デバイスの自己検証には 15~20 分かかる場合があります。この時点で、デバイスはロック解除、設定、デプロイなどの管理コマンドに応答する準備ができています。
4. Snowball Edge コントロールパネルから、
-
- [接続] を選択し、続けて [DHCP] または [静的] を選択します。
- 静的 IP を選択するには、IP アドレス、ネットマスク、およびデフォルトゲートウェイを入力します。
- 完了したら変更を適用します。
ワークステーションの準備
Linux、Mac、または Windows ワークステーションは、ロック解除、サービス設定、Snowball Edge のモニタリングなどの一般的な管理タスクを実行するために使用します。
設定
Snowball Edge デバイスを設定する前に、AWS マネジメントコンソールから、マニフェストファイルとロック解除コードを取得する必要があります。
IAM 機能を使用して、AWS Snowball リソースで操作を実行するためのきめ細かなアクセス許可を付与できます。この機能は、ロール、ポリシー、およびユーザーを使用して個々のサービスを制御する予定である場合に役立ちます。
Snowball Edge の管理には、AWS OpsHub または AWS CLI を使用できます。OpsHub をインストールすると、数回クリックするだけで、ロックを解除し、ネットワークインターフェイスを設定し、EC2 インスタンスを起動できます。AWS OpsHub は、Snowball Edge が利用可能な場所であれば無料で利用できます。このデモ動画で、AWS OpsHub の動作を確認してください。
AWS OpsHub の詳細と開始方法については、Snowball のリソースページにアクセスしてください。
OpsHub の使用をお勧めしますが、OpsHub を使用しない場合は、以下の CLI 手順に従って Snowball Edge デバイスを設定し、EC2 インスタンスを起動できます。これらの手順を実行するには、Snowball Edge クライアントと AWS CLI をダウンロードしてインストールする必要があります。
Snowball Edge のロック解除
このセクションでは、プライベートキーとアクセスキーを取得した後、Snowball Edge デバイスのロックを解除して EC2 サービスを設定します。
1. 管理ワークステーションにログインし、Snowball Edge プロファイルを作成します。複数の Snowball Edge デバイス使用している場合、プロファイルにより管理が容易になります。
workstation> snowballedge configure –profile snow1
Configuration will stored at /home/user1/.aws/snowball/config/snowball-edge.config
Snowball Edge Manifest Path:/home/user1/SNOW/JID14b41651-57e6-17ba-72d9-a56a5143a59f_manifest.bin
Unlock Code: 7a2f2-cab39-5b01c-597e4-a2b99
Default Endpoint: https://192.168.1.116
workstation>
2. Snowball Edge のロックを解除します。
workstation> snowballedge unlock-device --profile snow1
The Snowball Edge unlock status is: UnlockSnowballResult(status=UNLOCKING)
prompt>
3. Snowball Edge デバイスのロックが解除されていることを確認します。また、接続に使用した物理ネットワークインターフェイス ID を書き留めます。
workstation> snowballedge describe-device --profile snow1
"DeviceId" : "JID14b41651-57e6-17ba-72d9-a56a5143a59f",
"UnlockStatus" : {
"State" : "UNLOCKED"
},
"ActiveNetworkInterface" : {
"IpAddress" : "192.168.1.170"
},
"PhysicalNetworkInterfaces" : [ {
"PhysicalNetworkInterfaceId" : "s.ni-89d7e5s698a07d62e",
"PhysicalConnectorType" : "RJ45",
"IpAddressAssignment" : "STATIC",
"IpAddress" : "192.168.1.170",
"Netmask" : "255.255.255.0",
"DefaultGateway" : "192.168.1.2",
"MacAddress" : "aa:bb:cc:11:dd:de"
},
--lines removed --
}
prompt>
4. アクセスキーとシークレットキーを取得します。これらは、ローカル EC2 および S3 サービスエンドポイントへの認証に使用します。
workstation> snowballedge list-access-keys --profile snow1
{
"AccessKeyIds" : [ "KKKKKKKKKKKKKKK" ]
}
prompt>
workstation> snowballedge get-secret-access-key --access-key-id KKKKKKKKKKKKKK –profile snow1
[snowballEdge]
aws_access_key_id = KKKKKKKKKKKKKK
aws_secret_access_key = SSSSSSSSSSSSSSSSSSSSSSSSSSSSS
prompt>
5. AWS configure コマンドを使用して、新しいサービスプロファイルを作成します。
workstation> aws configure –profile compute1
AWS Access Key ID [None]:KKKKKKKKKKKKKKKKK
AWS Secret Access Key [None]:SSSSSSSSSSSSSSSSSSSSSS
Default region name [None]: snowball
Default output format [json]:
[vinod1@oecent SNOW]$
EC2 インスタンスの起動
このセクションでは、2 つの仮想ネットワークインターフェイスを作成し、2 つの EC2 インスタンスを起動します。最初のインスタンスはウェブサーバーとして使用し、2 番目のインスタンスはデータベースサーバーとして使用します。
1. ウェブサーバーに接続する仮想ネットワークインターフェイスを作成します。
workstation> snowballedge create-virtual-network-interface --physical-network-interface-id s.ni-89d7e5c698a07d62e --ip-address-assignment STATIC --static-ip-address-configuration IpAddress=192.168.1.144,Netmask=255.255.255.0 –profile snow1
{
"VirtualNetworkInterface" : {
"VirtualNetworkInterfaceArn" : "arn:aws:snowball-device:::interface/s.ni-8c184704e9c0b1872",
"PhysicalNetworkInterfaceId" : "s.ni-89d7e5c698a07d62e",
"IpAddressAssignment" : "STATIC",
2. 前の手順を繰り返し、データベースサーバーの仮想ネットワークインターフェイスを作成します。
workstation> snowballedge create-virtual-network-interface --physical-network-interface-id s.ni-89d7e5c698a07d62e --ip-address-assignment STATIC --static-ip-address-configuration IpAddress=192.168.1.145,Netmask=255.255.255.0 –profile snow1
{
"VirtualNetworkInterface" : {
"VirtualNetworkInterfaceArn" : "arn:aws:snowball-device:::interface/s.ni-8c184704e9c0b1872",
"PhysicalNetworkInterfaceId" : "s.ni-89d7e5c698a07d62e",
"IpAddressAssignment" : "STATIC",
3. Snowball Edge で Amazon マシンイメージ (AMI) ID を取得します。
workstation>aws ec2 describe-images --endpoint http://192.168.1.116:8008 --profile compute1
"State": "AVAILABLE",
"Description": "Image for building EC2 compute instance",
"ImageId": "s.ami-00c87a13a73b0bc06"
4. ウェブサーバーとして使用する最初の EC2 インスタンスを起動します。出力情報のインスタンス ID を書き留めます。
workstation> aws ec2 run-instances --image-id s.ami-09a13c1583275d1a6 --endpoint http://192.168.1.116:8008 --instance-type sbe-c.medium --profile compute1
{
"Instances": [
{
"SourceDestCheck": false,
"InstanceId": "s.i-84f09ff791b68",
"EnaSupport": false,
5. データベースサーバーとして使用する 2 番目の EC2 インスタンスを起動し、出力情報のインスタンス ID を書き留めます。新しいインスタンスが実行中の状態であることを確認します。
workstation> aws ec2 run-instances --image-id s.ami-09a13c1583275d1a6 --endpoint http://192.168.1.116:8008 --instance-type sbe-c.medium --profile compute1
{
"Instances": [
{
"SourceDestCheck": false,
"InstanceId": "s.i-84f09ff791b6828b0",
"EnaSupport": false,
workstation> aws ec2 describe-instances –instance-id s.i-84f09ff791b68 --endpoint http://192.168.1.116:8008 --profile compute1
"Code": 16,
"Name": "running"
},
]
}
workstation>
6. 仮想インターフェイス (パブリック IP アドレス) をウェブサーバーとデータベースサーバーに関連付けます。
workstation> aws ec2 associate-address --public-ip 192.168.1.144 --instance-id s.i-84f09ff791b68 --endpoint http://192.168.1.116:8008 --profile compute1
workstation>
workstation> aws ec2 associate-address --public-ip 192.168.1.145 --instance-id s.i-84f09ff791b6828b0 --endpoint http://192.168.1.116:8008 --profile compute1
workstation>
7.パブリック IP アドレスを使用して新しいインスタンスに接続し、ログインできることを確認します。
workstation> ssh ubuntu@192.168.1.144 -i MySshKey1.pem
webserver>$
ウェブサーバーの設定
このセクションでは、アップデートのインストール、ソフトウェアパッケージのインストール、およびウェブサーバーの設定を行います。
1. ウェブサーバーにログインし、お使いのドメインネームサーバー (DNS) またはパブリック DNS で /etc/resolv.conf
を更新します。
webserver>vi /etc/resolv.conf
2.ウェブサーバーの OS を更新し、Apache2、PHP、MySQL クライアント、および PHP ライブラリをインストールします。Snowball AMI を作成する前にこれらの手順を完了している場合は、スキップできます。
webserver> apt-get update
webserver>apt install apache2 php mysql-client php libapache2-mod-php php-mysql
Reading package lists...Done
3. 追加の PHP モジュールをインストールします。
webserver>sudo apt-get install php7.0-gd php7.0-mysql php7.0-dom php7.0-cli php7.0-json php7.0-common php7.0-mbstring php7.0-opcache php7.0-readline php7.0-xml
Reading package lists...Done
4. 新しくインストールした PHP モジュールを有効にします。
webserver>phpenmod xml gd dom
5. Apache および PHP モジュールを有効にします。
webserver>a2enmod php7.0
Considering conflict php5 for php7.0:
Module php7.0 already enabled
6. /var/www/html/index.php
を編集して、次の行を追加します。
<?php
phpinfo() ;
?>
7.ブラウザを開き、ウェブサーバーのルート (http://192.168.1.144/index.php
) をポイントすると、次のページが表示されるはずです。
データベースサーバーの設定
このセクションでは、MySQL をインストールし、データベースを構築し、データベースユーザーを作成し、データベースへのアクセスをウェブサーバーからのアクセスに制限しています。
1. データベースサーバーにログインします。
dbserver> ssh ubuntu@192.168.1.145 -i MySshKey1.pem
2. データベースサーバーインスタンスにオペレーティングシステムの更新をインストールします。
dbserver>apt update
3. MySQL サーバーをインストールします。インストール手順では、新しい MySQL ルートパスワードの入力を求められます。データベースのルートアクセスに強力なパスワードを指定します。
dbserver> apt-get install mysql-server
Reading package lists...Done
Building dependency tree
Reading state information...Done
The following additional packages will be installed:
4. MySQL のインストールが完了したら、root としてデータベースに接続します。
dbserver> mysql -u root -p
Enter password: 2Tier@@
Welcome to the MySQL monitor. Commands end with; or \g.
Your MySQL connection id is 4
Server version: 5.7.29-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates.All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates.Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help.Type '\c' to clear the current input statement.
mysql> show databases ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
5.コマンドプロンプトに移動します。vi/etc/mysql/mysql.conf.d/mysqld.cnf
を実行し、DB サーバーのプライベート IP アドレスで IP アドレスを更新します。これは、データベースサーバーのプライベート IP アドレスです。
注意: このアドレスを管理ワークステーションから取得するには、コマンド aws ec2 describe-instances –instance-id s.i-84f09ff791b68 --endpoint http://192.168.1.116:8008 --profile compute1
を実行します。
# localhost which is more compatible and is not less secure.
bind-address = 34.223.14.197
#
# * Fine Tuning
6. 新しいデータベースと新しいデータベースユーザーを作成します。この例では、データベース名 myapp1
、およびユーザー名 myapp1user
を使用します。また、新しいユーザーにアクセス許可を付与します。
dbserver> mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.29-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates.All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates.Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help.Type '\c' to clear the current input statement.
mysql> create database myapp1;
Query OK, 1 row affected (0.00 sec)
mysql> create user myapp1user IDENTIFIED BY 'myapp1user';
Query OK, 0 rows affected (0.00 sec)
mysql>
GRANT ALL ON myapp1.* TO myapp1user@'192.168.100.144' IDENTIFIED BY 'myapp1user';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
7. これで、ウェブサーバーにログオンすると、MySQL クライアントを使用してデータベースサーバーにアクセスできるはずです。
dbserver> mysql -u myapp1user -p -D myapp1 -h 192.168.17.145
Enter password: myapp1user
---- ---
Type 'help;' or '\h' for help.Type '\c' to clear the current input statement.
mysql>
Drupal の設定
このセクションでは、Drupal をインストールし、新しいユーザーを設定します。
1. ウェブサーバーにログオンし、Drupal インストールパッケージをダウンロードします。
webserver>cd /tmp
>wget https://ftp.drupal.org/files/projects/drupal-8.7.11.tar.gz
2. タールボールを展開します。デフォルトのサイト設定をコピーします。
3. ウェブブラウザ (http://192.168.1.144/drupal/core/install.php
) に移動し、Drupal のインストールを開始します。
4. [Next] をクリックしてインストールを確認し、データベースの [Advanced Options] で、MySQL データベース、ユーザー、およびパスワード情報を指定します。
5. [Save and continue] オプションを選択すると、Drupal がインストールを開始します。
6. 次の画面では、新しいサイトを設定するように求められ、新しいサイトを編集する権限を持つ新しい Drupal ユーザーを指定するよう求められます。これが Drupal を設定する最後のステップです。
7. ブラウザを開いて、その新しいサイトをポイントします。文書化されたプロセスに従うと、次のページが表示されます。
オプションの手順
- Drupal に動画モジュールをインストールして設定し、トランスコーディングと再生を行えます
- 特定のタイプのネットワークトラフィックを制限し、安全にデプロイするには、Snowball Edge セキュリティグループを設定します。
- Drupal デプロイのベストプラクティスを使用してアプリケーションを保護します。
まとめ
このブログでは、Snowball Edge を利用して Drupal を実行する多層アプリケーションのデプロイを完了しました。デバイスの注文方法、インストール方法、ロック解除方法やアプリケーションのデプロイ方法を説明しました。
さらに、Snowball Edge が、メディアをローカルで処理および変換し、クラウドに移行してさらに処理またはアーカイブできるようにするアーキテクチャをどのようにサポートするかを見てきました。Snowball Edge により、ネットワーク接続がない環境や帯域幅に制約のある環境でアプリケーションを実行できます。これをすべて達成するのに、主要なビルトアップインフラストラクチャが要らず、資本支出も発生しませんでした。
詳細については、AWS のドキュメントをご覧ください。ご質問やフィードバックがある場合は、コメント欄にコメントを残してください。
その他の参考文献: