カテゴリー: tech

  • aws-cliでEC2を作成しEIPを付与

    aws-cliでEC2を作成しEIPを付与

    はじめに

    よく使うコマンドで、いつもはシェルでラップしているけど、ある部分だけ抜き出して実施したいこともある

    注意事項

    ある程度は環境変数にしてある。変更しやすいように

    手順

    接続するための鍵

    SSH_KEY_NAME=tsukada.pem

    マシン情報

    IMAGE_ID=ami-*****
    sequrity_group_id=sg-*****
    subnet=subnet-*****
    
    #インスタンスタイプを定義。以下はt2.smallを使うこととする
    instance_type=t2.small

     

    EC2作成

    サーバ作成

    aws ec2 run-instances --key-name ${SSH_KEY_NAME} --image-id ${IMAGE_ID} --count 1 --instance-type ${instance_type} --security-group-ids ${sequrity_group_id} --subnet-id ${subnet} > create-server.json

     

    インスタンスにタグ付け

    # 今回立ち上げたいインスタンスの名前を定義する。
    INSTANCE_NAME=tsukada-test01
    instance_id=`cat create-server.json | jq -r .Instances[].InstanceId`
    
    aws ec2 create-tags --resources $instance_id --tags Key=Name,Value=${INSTANCE_NAME}

    Elastic IP付与

    aws ec2 allocate-address --domain vpc > ElasticIP.json

    ElasticIP にタグ付け

    allocation_id=`cat ElasticIP.json| jq -r .AllocationId`
    EIP_name=tsukada-eip
    aws ec2 create-tags --resources ${allocation_id} --tags Key=Name,Value=${EIP_name}

    ElasticIPをEC2インスタンスに紐付け

    aws ec2 associate-address --allocation-id ${allocation_id} --instance ${instance_id}
    
    SERVERIP=`cat ElasticIP.json | jq -r .PublicIp`

    接続

    ssh ec2-user@ `cat ElasticIP.json | jq -r $SERVERIP`

     

     

  • “transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused”: unknown

    “transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused”: unknown

    TL;DR

    dockerが高不可に陥ると本エラーが発生することがある  

    This error may occur if docker falls into high

    原因 problem

    Dockerを動かしているサーバ(ホスト)と、Dockerコンテナの通信の不通

    Communication failure between the server (host) running Docker and the Docker container

    解消 deal

    いろいろ調べたけどdocker自体を再起動するしかなさそう。

    I checked a lot, but it seems that docker itself can only be restarted.

    systemctl restart docker

    恒久対策を検討中  

  • AWSでkusanagi (wordpress高速化マシン) を使う落とし穴

    AWSでkusanagi (wordpress高速化マシン) を使う落とし穴

    はじめに

    AWSで稼働しているwordpressのmysqlが突如down!
    原因を探っていくと、高負荷時にOutOfMemoruになりOOM Killerが発動したことがわかった

    原因

    AWSのkusanagi AMIはデフォルトでswap設定されていない。デフォルトでswapの設定がされてなく、memoryがフルになると、すぐにOOM killerが発動されてしまう

    対処

    swapの設定を適切にした

    cat /proc/swaps
    dd if=/dev/zero of=/swapfile bs=1M count=2048
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    free -m

    fstabにswapfileの設定を追加

    /swapfile   swap        swap    defaults        0   0

    加えてやったこと

    かなり簡易的な監視だけど、もし必要なミドルウェアが落ちてしまった場合、自動で立ち上げるようcronをいれた。

    * * * * * ps ax |grep -v grep | grep -q mysql || sudo systemctl start mysql
    * * * * * ps ax |grep -v grep | grep -q nginx || sudo systemctl start nginx

    その後安定稼働している

  • AnsibleError: template error while templating string

    AnsibleError: template error while templating string

    はじめに

    AnsibleのTemplateモジュールはファイルの中身に変数を入れたいときなどにとても便利。
    なお、Templateモジュールの使い方については、あだちんさんのブログが非常にわかりやすい。

    Ansible’s Template module is very useful when you want to put variables in the contents of a file.
    About how to use Template module, His blog is very easy to understand.

    https://blog.adachin.me/archives/5526  

    問題 problem

    AnsibleでTemplateの転送に失敗する

    Template transfer fails with Ansible

    TASK [setup-hosts/development/web : Add Template user-setting files] ********
    failed: [dev-web] (item={u'owner': u'cron', u'path': u'home/cron/script/backupcp.sh', u'group': u'cron', u'mode': u'755'}) => {"changed": false, "item": {"group": "cron", "mode": "755", "owner": "cron", "path": "home/cron/script/backupcp.sh"}, "msg": "AnsibleError: template error while templating string: Missing end of comment tag. String: ` '<<<<<'\n"}
    

    特定の文字列がファイル内に存在しているとAnsibleに失敗するようだ

    Ansible seems to fail if a specific string exists in the file

    対処 deal

    処理の最初、最後をそれぞれ、“` {% raw %} “` 、“` {% endraw %} “` で挟む。以下のようなイメージ

    Insert “` {% raw%}  “` and “` {% endraw%} “` at the beginning and end of processing. The following image

    {% raw %}
    #!/bin/sh
    
    echo "done"
    {% endraw %}
    

     

  • Docker: E: Unable to locate package

    Docker: E: Unable to locate package

    はじめに

    サクッと環境を構築するのに、最初にapt-get updateを省略してしまったがために、ハマってしまった。今後同じ過ちを繰り返さない為にまとめ。

    実施したDockerfile

    実にシンプル。

    ubuntuを持ってきて、wgetとnodejsとnpmでも入れて動かそうと思った。いろんなサンプルファイルではしっかりとapt-get updateの記載があったが、あえて外した。そして結果的に時間を要した。

    実施したDockerfileはこちら

    #利用するUbuntuのイメージ
    FROM ubuntu:16.04
    
    # wgetをインストール
    RUN apt-get install -y wget 
    RUN apt-get install -y nodejs 
    RUN apt-get install -y npm

    docker buildコマンド

    $ docker build -t ubuntuuuu .
    Sending build context to Docker daemon   4.57GB
    Step 1/4 : FROM ubuntu:16.04
     ---> 7aa3602ab41e
    Step 2/4 : RUN apt-get install -y wget
     ---> Running in 30312e88bc87
    Reading package lists...
    Building dependency tree...
    Reading state information...
    E: Unable to locate package wget
    The command '/bin/sh -c apt-get install -y wget' returned a non-zero code: 100
    $ 

    E: Unable to locate package

    まずネットワーク周りを疑ったが、異常はなさそうだった。

    対処

    諸々installする処理の前にapt-get updateを入れたのみ。

    #利用するUbuntuのイメージ
    FROM ubuntu:16.04
    
    # wgetをインストール
    RUN apt-get update # 追加
    RUN apt-get install -y wget 
    RUN apt-get install -y nodejs 
    RUN apt-get install -y npm

    build結果

    $ docker build -t ubuntuuuu .
    Sending build context to Docker daemon   4.57GB
    Step 1/5 : FROM ubuntu:16.04
     ---> 7aa3602ab41e
    Step 2/5 : RUN apt-get update
     ---> Running in f929ef07a958
    Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
    Get:2 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
    
    (略)
    
    Removing intermediate container fc51f9cd4a4f
     ---> 3e9f68c18e10
    Successfully built 3e9f68c18e10
    Successfully tagged ubuntuuuu:latest
    $ 

     

    無事Successfullyになった。

    なぜapt-get updateが無いと失敗するのか

    憶測に過ぎないが、おそらくコンテナ版ubuntuを使わせる上で、必ず最新版のパッケージでないと使わせないというubuntu側(?)の意向のように感じる

    所感

    昨年発売され賑わっているAirPods ProだがAmazonでも販売を開始するようになり、Amazonでは今はポイントもつくようになっているようだ。自分は仕事しながら音楽聞かないが、ノイズキャンセルは気になる。

  • vixie-cronはAmazon Linuxでは利用できない

    vixie-cronはAmazon Linuxでは利用できない

    はじめに

    vixie-cronは、crontabで環境変数を設定可 (PATH、SHELL、HOME等)。それに加え、
    crontabファイルの冒頭に

    MAILTO=""

    加えるだけで、全てのメール通知を止めることができる便利なツール

    Amazon linuxでは

    しかし、Amazon linuxではvixie-cronはcronieに置き換わっている。
    https://aws.amazon.com/jp/amazon-linux-ami/2011.02-release-notes/#Obsoleted_Packages:

    anacron and vixie-cron are obsoleted by cronie

    cronieはvixie-cron同様、Cron deamonとして動くようだ

    cronie-1.4.4-2.4.amzn1 – Cron daemon for executing programs at set times

    yum infoの情報は以下の通り

    $ yum info cronie
    読み込んだプラグイン:priorities, update-motd, upgrade-helper
    14 packages excluded due to repository priority protections
    インストール済みパッケージ
    名前 : cronie
    アーキテクチャー : x86_64
    バージョン : 1.4.4
    リリース : 15.8.amzn1
    容量 : 174 k
    リポジトリー : installed
    要約 : Cron daemon for executing programs at set times
    URL : https://fedorahosted.org/cronie
    ライセンス : MIT and BSD and ISC and GPLv2
    説明 : Cronie contains the standard UNIX daemon crond that runs specified programs at
    : scheduled times and related tools. It is a fork of the original vixie-cron and
    : has security and configuration enhancements like the ability to use pam and
    : SELinux.

    yum info にあるようにvixie-cronからforkされているようなので、基本的にはvixie-cronをcronieに置き換えるだけで済みそう。

  • gitで間違えたブランチに書き込んだ際の対処

    gitで間違えたブランチに書き込んだ際の対処

     

    gitで間違えたブランチに書き込んだ

    一度退避させた後、ブランチを切り替えて、退避した変更を引き継ぐというやり方。しょっちゅう使っているコマンドの一つ

    今回はmasterブランチに書き込んだとする

    変更点を退避する

    git stashコマンドを使うと、変更点のみ退避することが可能

    $ git stash
    Saved working directory and index state WIP on master: 1169a810 Merge branch 'route53_20180724_120035' into 'master'
    $ 

     

    この時点でgit statusを実行すると変更点がなくなる。
    書き込んだmasterブランチはクリアーになる

    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    
    nothing to commit, working tree clean
    $

    新ブランチを作成

    本来作業したかったブランチを作成する
    今回はCloudWatchAlarmというブランチとする
    ここではcheckout -bオプションで作成と同時にgit branchを行う

    $ git checkout -b CloudWatchAlarm
    Switched to a new branch 'CloudWatchAlarm'
    $ 

    当然この時点ではgit statusを実施しても変更はない

    $ git status
    On branch CloudWatchAlarm
    nothing to commit, working tree clean
    $

    ブランチは存在している

    $ git branch
    * CloudWatchAlarm
      master
    $ 

    新ブランチに変更点を取り入れる

    git stash popコマンドで新ブランチに変更点を取り入れる

    $ git stash pop
    On branch CloudWatchAlarm
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   CloudWatchAlarm.sh
    
    no changes added to commit (use "git add" and/or "git commit -a")
    Dropped refs/stash@{0} (d081148067aad39eb60500c5fbb2a32a4c6c2566)
    $ 
    

    まとめ

    # 一時退避
    git stash
    
    # チェックアウト 
    git checkout xxx
    
    # 直前のgit stashを取り出す
    git stash pop

     

  • パスワードやAPI keyをコンソールから入力を、より安全にする

    パスワードやAPI keyをコンソールから入力を、より安全にする

    パスワードやAPI keyを入力する度、神経を尖らせている

    今までは

    HISTCONTROL=ignorespace

    を定義し、

     export __pass=xxxxxxxx

    のように、頭にスペースを付けることで、hitoryコマンドでパスワードが表示されないよう工夫をしていた

    Qiitaを見ててreadコマンドをうまく使うやり方を知った。

    Linux 作業手順書からべた書きパスワードをなくすシンプルなアイディア
    https://qiita.com/ktooi/items/ba156bb1848c31f04949

    $ read -sp "Please input your password: " __pass; echo
    ※ パスワード は XXX を参照して入力してください。
    $ curl -u "user:${__pass}" http://example.com

    シンプル!

    前途した HISTCONTROL を使う方法はキーなどを環境変数に設定するのに使い、
    readはパスワードに使うのが綺麗な使い分けかも。

  • denied: requested access to the resource is denied

    denied: requested access to the resource is denied

    docker hubのようなレジストリサービスを使った際、

    # docker push [remote repository]:[tag] 
    The push refers to a repository [xxxxx ]
    0b42c4d54897: Preparing 
    9cc8bf7662b6: Preparing 
    0b9ee6a3e512: Preparing 
    129b697f70e9: Preparing 
    denied: requested access to the resource is denied
    

    というエラーが表示された。

    これは単純な問題で、リポジトリやタグの指定が誤った際に表示される

     

    # レジストリサービスにログインする
    docker login
    
    # commitする(コンテナからimage化)
    docker commit [image名] [remote repository]:[tag]
    例: docker commit container git.example.com/infra/admin:20180717
    
    # リモートリポジトリへpush
    docker push [remote repository]:[tag]
    例: docker push git.example.com/infra/admin:20180717
    

     

    よくある間違いがプロジェクト名の誤り。docker imagesコマンドで名前が合っているか確認し、修正することでエラーは解消される。

  • docker loginは鍵認証できなそう

    docker loginは鍵認証できなそう

    はじめに

    ログインするには大きく二つ

    • パスワード認証
    • 鍵認証

    が定番だと思うが、残念ながらdocker hubなどレジストリへ登録するのに鍵認証は使えなさそうだ

    公式ドキュメント

    https://docs.docker.com/engine/reference/commandline/login/

    Name, shorthand Description
    --password , -p Password
    --password-stdin Take the password from stdin
    --username , -u Username

    パスワードを聞かれないようにするためには

    公式ドキュメントにあるように、テキストファイルに書き、標準出力で読み込ませるしかなさそう。

    $ cat ~/my_password.txt | docker login --username foo --password-stdin

    平文でパスワードを書くのは抵抗あるが、パーミッションを絞って、うまく調整するしかなさそう。痒い所に手が届かないのが残念。