• ..

Rust

    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