2020/07/25

メモリとボリューム容量不足

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 インスタンスを再起動しなくてもボリュームは反映されているかと思います。

 

  2020/06/28

Cloud9とは

Webプログラミング初心者にとって、最初につまずく「開発環境構築」ではないでしょうか。プログラム言語やサーバ、ツールのインストールには、それなりの知識と経験が必要になります。

そんな初心者のために近年、開発環境をクラウドで利用できるサービスが増えてきました。
Cloud9」もブラウザ上でWeb開発できるクラウドサービスのひとつです。

あらかじめIDE(統合開発環境)が用意されており、面倒なサーバ設定をしなくても実際の現場で利用されているような開発環境を手に入れられます。

またブラウザで利用できるため、Windows、MacといったPCに関係なくプログラミングが可能です。
ブラウザ上でプログラムを書き、実行するので、自分のPCにツールをインストールする必要がありません。

Cloud9 以外にも、クラウドで学習専用のツールとして「Monaca」や 「Paiza」などがあります。

Cloud9 とローカル環境

Cloud9 自体は無料で使うことができますが、Cloud9のサーバは AWS EC2 というサービスと連動しているため、EC2の起動時間分は料金がかかるので注意してください。
ちなみにAWSを初めて利用する場合は、1年間の無料枠があります。詳しくは AWS 無料利用枠 を参考にしてください。

またインターネットが利用できないと開発ができなくなるデメリットがありますので、最終的には自分のPC(ローカル)で開発環境をできる知識も身に付けるようにしましょう。

ローカル環境構築は、「VirtualBox 」「Vagrant」「Docker」といったツールを利用することが一般的です。 エディタは無料であれば、Microsoftの「VSCode」を利用するのをおすすめします。

Cloud9 を利用する

まず、ブラウザ Google Chrome のインストール、AWSの決済に必要なクレジットカードを用意してください。
※ブラウザはChrome を利用することをおすすめ

それでは Cloud9 を利用してみましょう。

  1. Chromeを開き、AWS にアクセスして、アカウントを作成する。
    ※AWSのアカウント作成には、クレジットカードの登録が必要

  2. AWSにサインインする。

  3. AWSコンソールにアクセスする。

  4. 「cloud9」で検索してアクセスする。

  5. 「Create Enviroment」をクリックする。

  6. 「Name」に任意の文字を入力し「Next step」をクリックする。

  7. 「Environment type」は「Create a new instance for environment (EC2)」を 「Instance type」は最小限にコストを抑える「t2.micro (1 GiB RAM + 1 vCPU)」を選択する。

  8. 「Platform」は RedHat系なら「Amazon Linux」Debian系なら「Ubuntu」を選択し「Next step」をクリックする。

  9. 内容を確認し「Create Enviloment」をクリックする。

  10. Cloud9 が起動し画面表示される。

これで、Cloud9 を利用することができました。

ファイルやフォルダ

Cloud9 ウィンドウの左には、ファイルやフォルダを管理するための画面があります。

この画面内で、ファイルやフォルダの作成、移動、削除など PC 同様のファイル操作ができます。

HTML/CSS, JavaScript, PHP, Ruby, Python といった言語がデフォルトで対応しているのですぐにプログラミングすることができます。 実際に Cloud9 のメニューからファイルを作成して、中央画面に表示して編集できるか試してみましょう。

ターミナル

Windows, Mac ではファイルやフォルダのマウスで操作する「GUI」が基本ですが、Webサーバではターミナル上でコマンド入力する「CUI」が基本です。 Cloud9 の画面下に表示されているのがターミナルです。

 

Webアプリ開発では Linux というサーバOSで構築されています。その Linux を操作するにはターミナルでコマンドが必須となります。 まだコマンドを利用したことがない人は、これから Linux のターミナルコマンドを少しずつ勉強してきましょう。

EC2を停止する

デフォルトでは未使用後に30分に EC2 が停止するようになっていますが、何かの拍子で Cloud9 に接続したままになるとEC2のインスタンスも起動したままになり、課金され続けることがあるかも知れません。

その場合、AWS EC2 を手動で停止することもできます。

  1. AWS マネジメントコンソール にアクセスし「ec2」で検索する。

  2. 起動中のインスタンスを左のチェックボックスで選択する。

  3. アクションメニュー > インスタンスの状態 > 停止 を選択する。

  4. インスタンスの停止を待ち確認する。
    念の為、Cloud9 画面を確実に終了しましょう。

さいごに

ここでは、Cloud9 の起動方法について説明しました。

実際にWeb開発環境構築にチャレンジしてみると、用語の意味や動作しないなど大変なことがわかるかと思います。VirtualBox, Vagrant, Docker といったツールで楽になったとはいえ、サーバの知識が若干必要になります。

まずWebサーバを起動してプログラム動かしたい人は、Cloud9 を体験してみましょう。

  2020/05/26

awsコマンドの返り値はJSONで返ってきますが、見やすく整形するには色々とコマンドを記述しなければいけません。

そこでフィルタプログラム jq を利用すると少しだけ整形が楽になります。

jq をインストール

Homebrew で jq をインストールします。


$ brew install jq

AWS EC2のインスタンス一覧を取得

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

参考

jqとcolumnでAWS CLIの出力を見やすく整形する

軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました

 

  2020/03/26

AWS ECR(Elastic Container Repository)を使ってみます。

Amazon Elastic Container Registry

ECRは、Dockerコンテナイメージを保存するレジストリサービスで、DockerHub の AWS版のような感じです。
AWS ECS 、AWS fargate と併用してコンテナを用いたサーバを運用します。

料金

2020/3時点で、以下の枠で無料のようです

Amazon Elastic Container Registry の料金

  • イメージ:500Mまで
  • 転送量:1G/月

リポジトリ作成

マネジメントコンソールもしくは、AWS Client でリポジトリを作成します。

マネジメントコンソールでリポジトリ作成する場合

使用方法にアクセス

 

リポジトリ名を入力、プッシュ時にスキャンを有効にして、リポジトリを作成

 

リポジトリが作成される

AWS CLI でリポジトリ作成する場合

aws コマンドでも、ECR リポジトリを作成できます。


$ aws ecr create-repository --repository-name php

AWS CLI のプロファイル追加

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 CLI 用の環境変数設定

AWS ECR のリージョン(東京)を環境変数に設定(.bash_profile)します。


$ vi .bash_profile

export AWS_REGION=ap-northeast-1

環境確認


$ source .bash_profile
$ echo $AWS_REGION
ap-northeast-1

Dockerfile 作成


FROM amazonlinux:2

SHELL ["/bin/bash", "-c"]

ARG PROJECT_DIR="projects"
WORKDIR $PROJECT_DIR

CMD ["/bin/bash"]

AWS ECR ログイン


$ aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin xxxxxx

Dockerイメージビルド


$ docker build -t linux2 .

Dockerイメージタグ付け


$ docker tag linux2:latest 517704528142.dkr.ecr.ap-northeast-1.amazonaws.com/linux2:latest

AWS ECR に Dockerイメージをプッシュ


$ docker push xxxx.amazonaws.com/linux2:latest

イメージが作成されたのを確認

AWS ECR リポジトリ確認


$ 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 イメージ確認

リポジトリ名一覧


$ aws ecr describe-repositories --query 'repositories[].repositoryName'

リポジトリを指定した詳細


$ aws ecr list-images --repository-name <code>linux2

 

AWS ECR イメージ削除


$ aws ecr batch-delete-image --repository-name linux2 --image-ids imageTag=v2.0

  2020/03/22

AWSのインスーラでインストール


$ 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 を利用する場合

別のバージョンの 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

pip でインストール


$ brew install openssl

AWS CLI 設定


$ 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 キー

参考

macOS に AWS CLI バージョン 1 をインストールする

  2019/08/25

AWS の Linux2 は最適化された(?)パッケージが用意されている

- CentOS7
- Apache2
- PHP7.3
- PostgreSQL *コマンドは sudo でなく root で実行している(root パスワードを別途設定済み)

yum アップデート

# yum update -y

Apache2

Apache インストール


# 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

ec2-user 設定

/var/www/ を ec2-user が利用できるように設定する

ec2-user を apache に追加


# usermod -a -G apache ec2-user

/var/www の権限

デフォルトの 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

PHP7.3

Amazon Linux2 用にパッケージが用意されており、PHP7.3 はここからインストールする。

Amazon Linux2 専用のパッケージ確認


# amazon-linux-extras list
.....
# amazon-linux-extras info php7.3

インストール


# amazon-linux-extras install php7.3

amazon-linux-extras で足りないパッケージは、yum でインストールすると良い

Composer インストール


$ 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

/user/local/bin に移動


$ sudo mv bin/composer /usr/local/bin/composer

composer初期化


$ composer init

composer.json が作成される

composer install


$ composer install
Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Generating autoload files

PostgreSQL10

amazon-linux-extras

amazon-linux-extras では psql コマンドのみのインストールの模様


# amazon-linux-extras install postgresql10

yum インストール


# yum install -y postgresql-server postgresql-devel postgresql-contrib

サービス起動


# systemctl start postgresql # postgresql-setup initdb

自動起動設定


# systemctl enable postgresql.service

postgres ユーザで確認


# 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のポート設定しないと一切アクセスできない。

AWS セキュリティグループ

セキュリティグループ > EC2 に紐付いたグループ > インバウンド > 編集

AWS セキュリティグループ

上記の設定は 5432 に全ての IPを許可(CIDR形式)しているので、必要であれば IP制限する
(postgresパスワードや、pg_hba.conf で制限しても良い)

<< Top < Prev Next > Last >>