aws-cli インストール

事前にpythonpipインストールする必要があります。

有れば、ただ以下を実行するだけです。

pip install awscli
#
# Collecting awscli
#   Downloading # https://files.pythonhosted.org/packages/27/b9/58853ad71a7fc44deb1ea48e0055f9b516398d9fce# 86845b9bb737b56b64/awscli-1.16.220-py2.py3-none-any.whl (1.9MB)
#     100% |████████████████████████████████| 1.9MB 509kB/s 
# ...

EBS の容量を増やす

EC2で色々やっていたところ容量が足りないと言われたので、確認すると9x%になっていたので容量を増やして見ることにしました。

現状

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
# ...
/dev/xvda1      10188068 xxxxxxx   1626996  9x% /

容量を上げる

まずEC2のページへ行って、左サイドバーのボリュームを選択します。

そして、アクションの中のボリュームの変更をクリックします。

希望するサイズを適当に入力して変更をクリックします。

そうしたらマシンをrebootなりで再起動したら反映されているはずです。

Cloud9 で NodeJS の環境を作る

Cloud9と新規Ec2マシンを同時に建てた場合のときの話です。

最新の NodeJS を入れる

nvmは使えるのでこれを使います。

nvm install stable
# Downloading https://nodejs.org/dist/v11.6.0/node-v11.6.0-linux-x64.tar.xz...
# ######################################################################## 100.0%
# Now using node v11.6.0 (npm v6.5.0-next.0)

このときはv11.6.0が入りました。今後ログインした時にこれがデフォルトで使えるようにします。

nvm alias default v11.6.0

他のユーザーでも使えるように

nを使う方法がおすすめです。以下で他のユーザーでは/usr/local/bin/nodeを見るような形にできます。

yarn global add n
sudo ~/.yarn/bin/n 11

最新の Yarn を入れる

yarnはこれだけです。

curl -o- -L https://yarnpkg.com/install.sh | bash

これはユーザー毎に実行する必要があります。ログで出たようにパスだけ通す必要があります。

export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"

fishユーザーはこっちで。

set -x PATH $HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin $PATH

Cloud9 上の NodeJS を最新にする

2019-02時点だとデフォルトで入っている NodeJS のバージョンはv6.16.0で少し古いです。これを現時点での最新のv11.9.0を使えるようにする方法です。

Cloud9のデフォルトアカウントでは、.bash_profilenvmの設定が読み込まれているので、最初からnvmコマンドを使うことができます。

nvm とは「Node Version Manager」 の略です。コマンド1つで最新バージョンにアップグレードしたり、あるバージョンにダウングレードすることができます。これ系には、npmで入れることができるnなどもあります。

最新 NodeJS のインストール

nvmで最新を入れるには以下のコマンドを実行します。

ec2-user:~/environment $ nvm install stable
# Downloading https://nodejs.org/dist/v11.9.0/node-v11.9.0-linux-x64.tar.xz...
# ######################################################################## 100.0%
# Now using node v11.9.0 (npm v6.5.0)

今回はv11.9.0が入ったというログがでます。

Cloud9 にログインした時に最新バージョンで使えるように

今のままだとログインした時のバージョンは最初のv6.16.0になってしまうので、デフォルトで今入れた最新バージョンを使うようにします。それは以下のようなコマンドでできます。バージョン部分には先程のインストール時に出力されたバージョンをコピペします。

ec2-user:~/environment $ nvm alias default v11.9.0
# default -> v11.9.0

一度ターミナルを閉じて、再度開いてバージョンを確認します。この時に先程コピペしたバージョンと同じなら完了です。

ec2-user:~/environment $ node -v
# v11.9.0

Cloud9 に fish shell を入れる

デフォルトユーザーのec2-userをそのまま使います。(カスタムユーザーを作ると接続できなくなる…)

Linuxbrew をインストール

Mac の Homebrew の Linux 版です。(でもv2.0.0で合体した?)1コマンドで色々インストールできて便利なツールです。
以下で入れれます。

sudo yum groupinstall 'Development Tools' -y
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

Fish をインストール

インストールは以下でできます。

/home/linuxbrew/.linuxbrew/bin/brew install fish

そして、一番最初の行にfishを使うというコマンドを追加します。

vim ~/.bash_profile

以下を追加。

/home/linuxbrew/.linuxbrew/bin/fish

これでターミナルを開いたとき勝手にfishが実行されてfishシェルな状態で始めることができます。

ちなみに以下の方法でターミナルを開いた時にデフォルトシェルな状態で始めれるかなと思ったのですが、何故かec2-userでは効きませんでした。

# ec2-user のパスワードセット
sudo passwd ec2-user
sudo reboot

sudo vim /etc/shells
# /home/linuxbrew/.linuxbrew/bin/fish 追加

# ec2-user のシェルを変更(パスワード聞かれる)
chsh -s /home/linuxbrew/.linuxbrew/bin/fish

Fish の設定で brew へのパスを通しておく

fishの設定ファイルは~/.config/fish/config.fishですので、これにパスを通す設定を書きます。

mkdir -p ~/.config/fish
touch ~/.config/fish/config.fish
echo 'set -x PATH /home/linuxbrew/.linuxbrew/bin $PATH' > ~/.config/fish/config.fish

再度ターミナルを開いて、

$ brew --version
# Homebrew 2.0.0

のようにバージョンが出れば完了です。

nodebrew で NodeJS を入れる

ちょっとnvmがfishと相性悪かったので、nodebrewで NodeJS の最新を入れてみます。

brew install nodebrew
echo 'set -x $HOME/.nodebrew/current/bin $PATH' >> ~/.config/fish/config.fish
mkdir -p ~/.nodebrew/src # これしないとダメだった

ここでターミナルを開き直して、

nodebrew install stable
nodebrew use stable

今回はv10.15.1が入りました。

$ node -v
# v10.15.1

ついでに Yarn

curl -o- -L https://yarnpkg.com/install.sh | bash

Cloud9 上で新規ユーザーを作って create-react-app しようとしたけどプレビューが見れない

前提

  1. useraddしてfooユーザーを作成
  2. su -l fooでチェンジ
  3. デフォルトユーザーのenvironmentの中でyarn create react-app hello-react-app
  4. その中でyarn start
  5. プレビュー

でもこんな感じの画面で見れません。

デフォルトユーザーとの違い

よく見ると作ったユーザーはポート3000で建ててるのに、デフォルトユーザーでは8080で建っています。どうやらデフォルトユーザーの環境変数には$PORT8080が登録されてて、これを見ている様子です。

# デフォルトユーザーで
echo $PORT # 8080

画像の注意書きにもそのような感じのことが書かれてますね。

package.json の編集

では、8080で立つように scriptsstartPORT=8080 react-scripts startとしてみましょう。そして再度yarn start

結果

無事プレビューできました!

AWS CLI で IAM ユーザーを運用する

aws cli でとあるユーザーを追加するには、

aws configure

でした。1ユーザーならいいのですが、複数ユーザー操作したい場合にこれだと不便です。

--profile オプション

その場合は--profileオプションを使って「このユーザーの設定ですよ」と明示できます。

aws --profile foo configure 

これでfooというユーザーの情報が登録できました。あとは他のすべてのコマンドで--profile fooと追加します。

aws --profile foo s3 sync images s3://hoge/images
aws --profile foo s3 ls hoge

RDS の Postgresql がタイムアウトする

こんなエラーです。

psql: could not connect to server: Operation timed out
        Is the server running on host "host" (x.x.x.x) and accepting
        TCP/IP connections on port 5432?

セキュリティグループの Inbound に Postgresql で使っているポートが許可されているか

psqlで接続するとき、デフォルトで5432ポートが使われます。以下の場所からそれが許可されているか確認します。

もし、5432に関する設定がなければ以下のように追加します。

接続できれば完了です。

EC2 インスタンスタイプを変更

対象のインスタンスが起動している場合はまず停止します。次にアクションから「インスタンスタイプの変更」をクリック。

好きなインスタンスを選択して「適用」します。

あとはインスタンスを再度起動するだけです。

CLI から RDS データベースを稼働・停止する

--profile nju33が設定されているものとします。

停止

以下のようなコマンドを実行します。

aws --profile nju33 rds stop-db-instance --db-instance-identifier <DB 識別子>

実行後うまくいくと「停止中」となり、しばらく待つと完全に「停止」します。

稼働

今度はrds start-db-instanceコマンドを使います。以下のようにです。

aws --profile nju33 rds start-db-instance --db-instance-identifier <DB 識別子>

「停止」な状態のインスタンスにのみ使えます。「停止中」に実行すると以下のエラーになります。

An error occurred (InvalidDBInstanceState) when calling the StartDBInstance operation:
Instance *** is not stopped, cannot be started.

基本実行後 JSON が出力されれば成功のようです。停めれるのは最高で7日間のようなので、あまり使わない場合などはcronなどで自動で走るようにすると良さそうです。

CLI で DynamoDB を扱う

ここでは Docker をlocalhost:8000で動かし、それを対象に見ていきます。DynamoDB を Docker で動かすには以下のコマンドを実行します。

docker run \            
  --detach \            # バックグランドで、
  --name DynamoDB \     # 名前は'DynamoDB'で、
  --publish 8000:8000 \ # `localhost:8000`で、
  amazon/dynamodb-local # `amazon/dynamodb-local`を起動

AWS CLI の DynamoDB を扱う為のコマンドはaws dynamodbです。これのサブコマンドに--endpoint-url http://localhost:8000オプションを付けることでローカルの DynamoDB に対して命令することができます。

テーブル一覧

list-tablesサブコマンドを使います。まだ何も無いので空です。

aws dynamodb list-tables \
  --endpoint-url http://localhost:8000
# {
#   "TableNames": []
# }

テーブル作成

create-tableサブコマンドを使います。まだ何も無いので空です。

aws dynamodb create-table \
  # 'MusicCollection'というテーブル名で、 \
  --table-name MusicCollection \
  # 文字列の'Artist'と'SongTitle'値を持ち、 \
  --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
  # 'Artist'をパーティションキー、'SongTitle'をソートキーとします \
  --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
  # 1秒間に5回の読み込みと書き込みができます(デフォルト) \
  --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
  --endpoint-url http://localhost:8000
# {
#     "Table": {
#         "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/MusicCollection", 
#         "AttributeDefinitions": [
#             {
#                 "AttributeName": "Artist", 
#                 "AttributeType": "S"
#             }, 
#             {
#                 "AttributeName": "SongTitle", 
#                 "AttributeType": "S"
#             }
#         ], 
#         "ProvisionedThroughput": {
#             "NumberOfDecreasesToday": 0, 
#             "WriteCapacityUnits": 5, 
#             "LastIncreaseDateTime": 0.0, 
#             "ReadCapacityUnits": 5, 
#             "LastDecreaseDateTime": 0.0
#         }, 
#         "TableSizeBytes": 0, 
#         "TableName": "MusicCollection", 
#         "BillingModeSummary": {
#             "LastUpdateToPayPerRequestDateTime": 0.0, 
#             "BillingMode": "PROVISIONED"
#         }, 
#         "TableStatus": "ACTIVE", 
#         "KeySchema": [
#             {
#                 "KeyType": "HASH", 
#                 "AttributeName": "Artist"
#             }, 
#             {
#                 "KeyType": "RANGE", 
#                 "AttributeName": "SongTitle"
#             }
#         ], 
#         "ItemCount": 0, 
#         "CreationDateTime": 1558979217.277
#     }
# }

テーブル詳細の取得

describe-tableサブコマンドを使います。

aws dynamodb describe-table \
  # 'MusicCollection'というテーブル名を取得 \
  --table-name MusicCollection \
  --endpoint-url http://localhost:8000 
# ...結果は`create-table`のものと同じ

データの挿入

put-itemサブコマンドを使います。

aws dynamodb put-item \
  # 'MusicCollection'というテーブルに新しいデータを \
  --table-name MusicCollection \
  # パーティションは'藤山一郎'、ソートキーは'夢淡き東京'という内容で入れます \
  --item '{ 
    "Artist": {"S": "藤山一郎"},
    "SongTitle": {"S": "夢淡き東京"},
    "Youtube": {"M": { 
      "url": {"S": "https://www.youtube.com/watch?v=M9UZw7Q5hBc&loop=0"}
    }}
  }' \
  --endpoint-url http://localhost:8000
# ...出力はなし

データ一覧取得

scanサブコマンドを使います。

aws dynamodb scan \
  # 'MusicCollection'テーブルのデータを取得 \
  --table-name MusicCollection \
  # (以下は無くてもいいけど、使ってみる) \
  # 'Artist'が'藤山一郎'のもので絞り込む
  --expression-attribute-names '{"#name": "Artist"}' \
  --expression-attribute-values '{":hujiyama": {"S": "藤山一郎"}}' \
  --filter-expression '#name = :hujiyama' \
  --endpoint-url http://localhost:8000    
# {
#     "Count": 1, 
#     "Items": [
#         {
#             "Youtube": {
#                 "M": {
#                     "url": {
#                         "S": "https://www.youtube.com/watch?v=M9UZw7Q5hBc&loop=0"
#                     }
#                 }
#             }, 
#             "SongTitle": {
#                 "S": "夢淡き東京"
#             }, 
#             "Artist": {
#                 "S": "藤山一郎"
#             }
#         }
#     ], 
#     "ScannedCount": 1, 
#     "ConsumedCapacity": null
# }

queryでも取得できます。

aws dynamodb query \
  # 'MusicCollection'テーブルのデータを取得 \
  --table-name MusicCollection \
  --expression-attribute-names '{"#name": "Artist", "#title": "SongTitle"}' \
  --expression-attribute-values '{":hujiyama": {"S": "藤山一郎"}, ":yumeawaki_tokyo": {"S": "夢淡き東京"}}' \
  --key-condition-expression '#name=:hujiyama AND #title=:yumeawaki_tokyo' \
  --endpoint-url http://localhost:8000   
# ...`scan`結果と同じ

データの取得

get-itemサブコマンドを使います。

aws dynamodb get-item \
  # 'MusicCollection'テーブルから \
  --table-name MusicCollection \
  # '藤山一郎'なデータを取得します \
  --key '{"Artist": {"S": "藤山一郎"}, "SongTitle": {"S": "夢淡き東京"}}' \
  --endpoint-url http://localhost:8000 
# {
#     "Item": {
#         "Youtube": {
#             "M": {
#                 "url": {
#                     "S": "https://www.youtube.com/watch?v=M9UZw7Q5hBc&loop=0"
#                 }
#             }
#         }, 
#         "SongTitle": {
#             "S": "夢淡き東京"
#         }, 
#         "Artist": {
#             "S": "藤山一郎"
#         }
#     }
# }

データの更新

update-itemサブコマンドを使います。

aws dynamodb update-item \
  # 'MusicCollection'テーブルの対象の行に、 \
  --table-name MusicCollection \
  --key '{"Artist": {"S": "藤山一郎"}, "SongTitle": {"S": "夢淡き東京"}}' \
  # 以下の値で追加・’更新する \
  --update-expression 'SET newAttributeName = :newAttributeValue' \
  --expression-attribute-values '{":newAttributeValue": {"S": "value"}}' \
  # そして、更新したデータだけ返す \
  --return-values UPDATED_NEW \
  --endpoint-url http://localhost:8000
# {
#   "Attributes": {
#     "newAttribute": {
#       "S": "value"
#     }
#   } 
# }

データの削除

delete-itemサブコマンドを使います。

aws dynamodb delete-item \
  # 'MusicCollection'テーブルから \
  --table-name MusicCollection \
  # '藤山一郎'パーティションから'夢淡き東京'という曲を削除します \
  --key '{"Artist": {"S": "藤山一郎"}, "SongTitle": {"S": "夢淡き東京"}}' \
  --endpoint-url http://localhost:8000 
# ...出力はなし

バックアップ作成

create-backupサブコマンドを使います。

aws dynamodb create-backup \
  --table-name MusicCollection \
  --backup-name MusicCollectionBackup

このようなコマンドを実行すると以下のようなログが出力されます。(nは数値です)
CREATINGというステータスが表示されていますが、これがAVAILABLEになるとバックアップ完了です。

{
    "BackupDetails": {
        "BackupCreationDateTime": nnnnnnnnn.nnn, 
        "BackupName": "MusicCollectionBackup", 
        "BackupStatus": "CREATING", 
        "BackupType": "USER", 
        "BackupSizeBytes": nnn, 
        "BackupArn": "arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn"
    }
}

バックアップ一覧

list-backupsを実行するだけです。

aws dynamodb list-backups
# [
#   {
#     "BackupDetails": {
#       "BackupCreationDateTime": nnnnnnnnn.nnn, 
#       "BackupName": "MusicCollectionBackup", 
#       "BackupStatus": "AVAILABLE", 
#       "BackupType": "USER", 
#       "BackupSizeBytes": nnn, 
#       "BackupArn": "arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn"
#     }
#   }
# ]

バックアップの削除

delete-backupサブコマンドを使います。--backup-arnが必須でこれはlist-backupsBackupArnから取得します。

aws dynamodb delete-backup \
  --backup-arn 'arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn'

バックアップの適用

restore-table-from-backupサブコマンドを使います。

aws dynamodb restore-table-from-backup \
  --target-table-name MusicCollection
  --backup-arn 'arn:aws:dynamodb:ap-northeast-1:nnnnnnnnnnn:table/MusicCollection/backup/nnnnnnnnnnnnnn-nnnnnnnnn'

EC2 のタイムゾーンを日本時間にする

/etc/localtimeとして/usr/share/zoneinfo/Japanのシンボリックリンクを置きます。

sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime

/usr/share/zoneinfoは各国のタイムゾーンの情報?がいろいろ置かれているディレクトリのようです。

total 388
drwxr-xr-x  2 root root   4096 Feb 14 03:10 Africa
...
drwxr-xr-x  2 root root   4096 Feb 14 03:10 Asia
drwxr-xr-x  2 root root   4096 Feb 14 03:10 Australia
drwxr-xr-x  2 root root     59 Feb 14 03:10 Brazil
drwxr-xr-x  2 root root    136 Feb 14 03:10 Canada
...
-rw-r--r--  2 root root    318 Jan 29 00:08 Japan
...
-rw-r--r--  2 root root    127 Jan 29 00:08 UCT
...

/etc/sysconfig/clockというファイルを編集して、以下のようにします。

sudo vim /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true

そして再起動します。

sudo reboot