AWS EC2 の AMI(マシンイメージ) で Amazon Linux 2 を選択してサーバ構築すると amazon-linux-extras コマンドが利用できます。
amazon-linux-extras は Amazon Linux 用のパッケージツールで、主要なソフトウェアをまとめてインストールできます。
ただし、amazon-linux-extras パッケージに含まれないソフトウェアは別途インストールする必要があります。
amazon-linux-extras のコマンドは単純で、以下の4つのコマンドが用意されています。
amazon-linux-extras でトピック一覧(パッケージ情報)を確認できます。 amazon-linux-extras list でも同様の動作をします。
$ amazon-linux-extras
...
33 java-openjdk11 available [ =11 =stable ]
34 lynis available [ =stable ]
35 kernel-ng available [ =stable ]
36 BCC available [ =0.x =stable ]
37 mono available [ =5.x =stable ]
38 nginx1 available [ =stable ]
...
42 php7.4=latest enabled [ =stable ]
...
数字の次にの項目が amazon-linux-extras のトピック名(パッケージ名)です。実際にインストールする Linux のパッケージ名とは違うので注意が必要です。
available はインストール可能な状態、enabled は実際にインストールされた状態です。
また、amazon-linux-extras info でパッケージ内容を確認できます。例えば、php7.4 のパッケージを確認してみます。
$ amazon-linux-extras info php7.4
php7.4 recommends php-cli # yum install php-cli
php7.4 recommends php-pdo # yum install php-pdo
php7.4 recommends php-fpm # yum install php-fpm
php7.4 recommends php-json # yum install php-json
php7.4 recommends php-mysqlnd # yum install php-mysqlnd
Amazon Linux 2 の Linux のディストリビューションは RHEL7 / CentOS7 を採用しています。よって、実際のパッケージインストールコマンドは yum install が実行されます。
amazon-linux-extras install でパッケージを管理者権限でインストールします。
$ sudo amazon-linux-extras install トピック名
トピック名 php7.4 をインストールする例です。
$ sudo amazon-linux-extras install php7.4
ヘルプにはありませんが amazon-linux-extras disable でパッケージの動作を無効にすることもできます。
$ sudo amazon-linux-extras disable トピック名
実際にパッケージが削除されるわけでなく yum remove などで削除すると、パッケージ依存の問題が発生する可能性があるので注意が必要です。
amazon-linux-extras はよく利用するパッケージのインストールを少しだけ楽にしてくれるツールであることがわかりました。
AWS の無料枠では t2.micro でメモリ 1G のため、Cloud9 で Laravel のインストールなどでエラーになってしまうことがあります。
また EC2 のボリューム EBS(Amazon EBS Elastic Volumes)もデフォルト 10G のためプロジェクト作成で不足がちになります。
clound9 などでメモリ不足が発生すると以下のようなエラーになります。
[ErrorException]
proc_open(): fork failed - Cannot allocate memory
この対処として Swap 領域を確保して対応すると良いでしょう。
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
$ sudo /sbin/mkswap /var/swap.1
$ sudo /sbin/swapon /var/swap.1
AWS Console にログインし、EC2 対象のインスタンスを選択して「アクション > ボリューム変更」を選択します。
サイズに容量(GB)を入力し【変更】をクリックします。
※無料枠は 合計 30GB が上限なので注意が必要です
ボリュームの変更確認画面で【はい】をクリックします。
ボリュームが変更されたら【閉じる】をクリックします。
ボリュームが変更されているのを確認しましょう。
EC2 インスタンスを再起動しなくてもボリュームは反映されているかと思います。
Webプログラミング初心者にとって、最初につまずく「開発環境構築」ではないでしょうか。プログラム言語やサーバ、ツールのインストールには、それなりの知識と経験が必要になります。
そんな初心者のために近年、開発環境をクラウドで利用できるサービスが増えてきました。
「Cloud9」もブラウザ上でWeb開発できるクラウドサービスのひとつです。
あらかじめIDE(統合開発環境)が用意されており、面倒なサーバ設定をしなくても実際の現場で利用されているような開発環境を手に入れられます。
またブラウザで利用できるため、Windows、MacといったPCに関係なくプログラミングが可能です。
ブラウザ上でプログラムを書き、実行するので、自分のPCにツールをインストールする必要がありません。
Cloud9 以外にも、クラウドで学習専用のツールとして「Monaca」や 「Paiza」などがあります。
Cloud9 自体は無料で使うことができますが、Cloud9のサーバは AWS EC2 というサービスと連動しているため、EC2の起動時間分は料金がかかるので注意してください。
ちなみにAWSを初めて利用する場合は、1年間の無料枠があります。詳しくは AWS 無料利用枠 を参考にしてください。
またインターネットが利用できないと開発ができなくなるデメリットがありますので、最終的には自分のPC(ローカル)で開発環境をできる知識も身に付けるようにしましょう。
ローカル環境構築は、「VirtualBox 」「Vagrant」「Docker」といったツールを利用することが一般的です。 エディタは無料であれば、Microsoftの「VSCode」を利用するのをおすすめします。
まず、ブラウザ Google Chrome のインストール、AWSの決済に必要なクレジットカードを用意してください。
※ブラウザはChrome を利用することをおすすめ
それでは Cloud9 を利用してみましょう。
Chromeを開き、AWS にアクセスして、アカウントを作成する。
※AWSのアカウント作成には、クレジットカードの登録が必要
AWSにサインインする。
AWSコンソールにアクセスする。
「cloud9」で検索してアクセスする。
「Create Enviroment」をクリックする。
「Name」に任意の文字を入力し「Next step」をクリックする。
「Environment type」は「Create a new instance for environment (EC2)」を 「Instance type」は最小限にコストを抑える「t2.micro (1 GiB RAM + 1 vCPU)」を選択する。
「Platform」は RedHat系なら「Amazon Linux」Debian系なら「Ubuntu」を選択し「Next step」をクリックする。
内容を確認し「Create Enviloment」をクリックする。
Cloud9 が起動し画面表示される。
これで、Cloud9 を利用することができました。
Cloud9 ウィンドウの左には、ファイルやフォルダを管理するための画面があります。
この画面内で、ファイルやフォルダの作成、移動、削除など PC 同様のファイル操作ができます。
HTML/CSS, JavaScript, PHP, Ruby, Python といった言語がデフォルトで対応しているのですぐにプログラミングすることができます。 実際に Cloud9 のメニューからファイルを作成して、中央画面に表示して編集できるか試してみましょう。
Windows, Mac ではファイルやフォルダのマウスで操作する「GUI」が基本ですが、Webサーバではターミナル上でコマンド入力する「CUI」が基本です。 Cloud9 の画面下に表示されているのがターミナルです。
Webアプリ開発では Linux というサーバOSで構築されています。その Linux を操作するにはターミナルでコマンドが必須となります。 まだコマンドを利用したことがない人は、これから Linux のターミナルコマンドを少しずつ勉強してきましょう。
デフォルトでは未使用後に30分に EC2 が停止するようになっていますが、何かの拍子で Cloud9 に接続したままになるとEC2のインスタンスも起動したままになり、課金され続けることがあるかも知れません。
その場合、AWS EC2 を手動で停止することもできます。
ここでは、Cloud9 の起動方法について説明しました。
実際にWeb開発環境構築にチャレンジしてみると、用語の意味や動作しないなど大変なことがわかるかと思います。VirtualBox, Vagrant, Docker といったツールで楽になったとはいえ、サーバの知識が若干必要になります。
まずWebサーバを起動してプログラム動かしたい人は、Cloud9 を体験してみましょう。
awsコマンドの返り値はJSONで返ってきますが、見やすく整形するには色々とコマンドを記述しなければいけません。
そこでフィルタプログラム jq を利用すると少しだけ整形が楽になります。
Homebrew で jq をインストールします。
$ brew install jq
jEC2のインスタンスを「インスタンスID」「タグ」「インスタンスタイプ」で一覧表示してみます。
その際、jq のオプション -c(--compact-output)で圧縮出力します。
aws ec2 describe-instances | jq -c '.[][].Instances[]
| [.InstanceId,[.Tags[] | select(.Key == "Name").Value][], .InstanceType]'
["i-0cxxxxxx","Linux2","t2.micro"]
["i-01xxxxxx","cloud9-sample","t2.micro"]
このようにパイプ(|)で連結させてフィルタリングします。
結果内容を揃える場合、Macの標準コマンド column を利用します。
その際、jq コマンドのオプションを -r(--raw-output)で生出力にします。
aws ec2 describe-instances \
| jq -r \
'.[][].Instances[]
| [.InstanceId,
[.Tags[] | select(.Key == "Name").Value][],
.InstanceType]
| @tsv' \
| column -t
i-0cxxxxxx Linux2 t2.micro
i-01xxxxxx cloud9-sample t2.micro
軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました
AWS ECR(Elastic Container Repository)を使ってみます。
Amazon Elastic Container Registry
ECRは、Dockerコンテナイメージを保存するレジストリサービスで、DockerHub の AWS版のような感じです。
AWS ECS 、AWS fargate と併用してコンテナを用いたサーバを運用します。
2020/3時点で、以下の枠で無料のようです
Amazon Elastic Container Registry の料金
マネジメントコンソールもしくは、AWS Client でリポジトリを作成します。
使用方法にアクセス
リポジトリ名を入力、プッシュ時にスキャンを有効にして、リポジトリを作成
リポジトリが作成される
aws コマンドでも、ECR リポジトリを作成できます。
$ aws ecr create-repository --repository-name php
AWS Client を利用して ECRのプロファイルを作成します。
リージョンは東京(ap-northeast-1)としています。
$ aws configure --profile ecr
AWS Access Key ID [None]: AIM アカウント ID
AWS Secret Access Key [None]: AIM シークレットキー
Default region name [None]: ap-northeast-1
Default output format [None]:
AWS ECR のリージョン(東京)を環境変数に設定(.bash_profile)します。
$ vi .bash_profile
export AWS_REGION=ap-northeast-1
$ source .bash_profile
$ echo $AWS_REGION
ap-northeast-1
FROM amazonlinux:2
SHELL ["/bin/bash", "-c"]
ARG PROJECT_DIR="projects"
WORKDIR $PROJECT_DIR
CMD ["/bin/bash"]
$ aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin xxxxxx
$ docker build -t linux2 .
$ docker tag linux2:latest 517704528142.dkr.ecr.ap-northeast-1.amazonaws.com/linux2:latest
$ docker push xxxx.amazonaws.com/linux2:latest
イメージが作成されたのを確認
$ aws ecr describe-repositories --region ${AWS_REGION}
{
"repository": {
"registryId": "xxxxxxxxxxxx",
"repositoryName": "linux2",
"repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/linux2",
"createdAt": 1585197107.0,
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": true
}
}
}
$ aws ecr describe-repositories --query 'repositories[].repositoryName'
$ aws ecr list-images --repository-name linux2
--region=${AWS_REGION}
$ aws ecr batch-delete-image --repository-name linux2 --image-ids imageTag=v2.0
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
別のバージョンの Python で AWS CLI をインストールする場合、Python の絶対パス指定してインストールスクリプトを実行が必要です。
$ sudo /usr/local/bin/python3.7 awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
ターミナルを再起動すれば、aws コマンドが利用できます。
$ aws --version
aws-cli/1.18.27 Python/3.7.4 Darwin/18.7.0 botocore/1.15.27
$ brew install openssl
$ pyenv install 3.7.0$ pip install --upgrade pip $ curl -O https://bootstrap.pypa.io/get-pip.py $ python3 get-pip.py --user $ pip3 install awscli --upgrade --user
$ aws configure アクセスキー: シークレットキー: リージョン: ap-northeast-1 output format:
$ aws ec2 create-key-pair --key-name キー
$ aws ec2 create-key-pair --key-name キー --query 'KeyMaterial' --output text > キー .pem
$ aws ec2 describe-key-pairs --key-name キー
AWS の Linux2 は最適化された(?)パッケージが用意されている
- CentOS7
- Apache2
- PHP7.3
- PostgreSQL *コマンドは sudo でなく root で実行している(root パスワードを別途設定済み)
# yum update -y
# yum -y install httpd
# systemctl start httpd
*CentOS6系では chkconfig httpd on
# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
# systemctl is-enabled httpd
/var/www/ を ec2-user が利用できるように設定する
# usermod -a -G apache ec2-user
デフォルトの DocumentRoot である /var/www の権限を ec2-user : apache に変更 ディレクトリ(775)とファイル(664) で利用できるようにする
# chown -R ec2-user:apache /var/www
# chmod 2775 /var/www && find /var/www -type d -exec chmod 2775 {} ;
# find /var/www -type f -exec chmod 0664 {} ;
*2775 の 2 は setgid
ec2-user で所属グループの確認
ec2-user を再ログインして確認
$ groups ec2-user
Amazon Linux2 用にパッケージが用意されており、PHP7.3 はここからインストールする。
# amazon-linux-extras list
.....
# amazon-linux-extras info php7.3
# amazon-linux-extras install php7.3
amazon-linux-extras で足りないパッケージは、yum でインストールすると良い
$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer Downloading...
Composer (version 1.9.0) successfully installed to: /home/vagrant/composer.phar
Use it: php composer.phar
$ sudo mv bin/composer /usr/local/bin/composer
$ composer init
composer.json が作成される
$ composer install
Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Generating autoload files
amazon-linux-extras では psql コマンドのみのインストールの模様
# amazon-linux-extras install postgresql10
# yum install -y postgresql-server postgresql-devel postgresql-contrib
# systemctl start postgresql # postgresql-setup initdb
# systemctl enable postgresql.service
# su - postgres
$ psql -l
could not change directory to "/home/ec2-user": Permission denied List of databases
.....
パスワードで制御するかIPで制御するか、はたまたその他の方式かはセキュリティポリシーによって違うので割愛 (postgres.conf & pg_hba.conf 設定など)
AWS はセキュリティグループで PostgreSQLのポート設定しないと一切アクセスできない。
セキュリティグループ > EC2 に紐付いたグループ > インバウンド > 編集
上記の設定は 5432 に全ての IPを許可(CIDR形式)しているので、必要であれば IP制限する
(postgresパスワードや、pg_hba.conf で制限しても良い)