カテゴリー: aws

AWSの情報をまとめる

  • ZipFile length cannot exceed 4096 characters. For larger source use S3Bucket/S3Key properties instead.

    ZipFile length cannot exceed 4096 characters. For larger source use S3Bucket/S3Key properties instead.

    はじめに

    ymlファイルをCloudFormationでデプロイした時、というエラーが出た。

    When yml file is deployed with CloudFormation, bellow error was happened.

    ZipFile length cannot exceed 4096 characters. For larger source use S3Bucket/S3Key properties instead.

     

    原因 reason

    zip化する際に含まれるコードが4096文字を越えると本エラーに陥る。

    This error occurs when the code included in zipping exceeds 4096 characters.

    対処 deal

    いらないところを削除するなどして、コードをコンパクトにする。

    Make the code more compact by deleting unnecessary parts.

  • HAproxyでHR構成を組む on AWS

    HAproxyでHR構成を組む on AWS

    はじめに

    DBサーバへ接続する際、readレプリカを複数台作ることが一般的だが、readレプリカに対してバランシングはインフラの設計ポイントとなる。auroraであれば自動でreadレプリカを作ってくれるのでその考慮は要らないがレガシーなシステムを運用している場合それは使えない。今回はAWSで組むこととする。

    やりたいこと

    多くのプログラムはそうであろう構成。

    プログラムは更新用(write)と参照用(read)で接続先を変え、
    データベースはMasterとSlaveでレプリケーションをしている。

    Slaveは今後増える可能性もあるのに加え、Slaveが1台ダウンしてもサービスが稼働できるようにするには、クラスタリング構成をする必要がある。

    クラスタリングソフトの検討

    名前考察
    keepalived名前解決不可能。また、ググっても実績なし
    HAProxyAmazon linuxでyumでのversionが古い(1.5.2)。v1.6の resolvers オプションを使ってVPCのnameserverを参照するようにし、A Recordの変更に追従させる事が可能だが、ソースからのinstallになってしまう
    MySQL Routerアルファ版 本番利用 非推奨
    Consul by HashiCorpググっても出ない
    ProxySQLAmazonLinux非対応

    keppalivedはAWSでは難しいようだ。

    今回はHA proxyで実現することにした。

    対応

    Amazon linuxの上にHAproxyを使いクラスタリングを実現する。

     

    HAproxyのインストール

    amazon linuxの場合、yumでinstallしようとすると、versionが古い。

    そのため、sourceでインストールすることにした

    yum install -y gcc
    cd /usr/local/src/
    wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.8.tar.gz
    pwd
    tar xvfz haproxy-1.8.8.tar.gz
    ls -ltr
    cd haproxy-1.8.8
    make TARGET=generic
    make install
    

    HAproxyの設定

    設定は以下の通り

    $ cat /etc/haproxy/haproxy.cfg 
    global
        log         tsukada01 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4096
        user        haproxy
        group       haproxy
        daemon
        stats socket /var/lib/haproxy/stats
        stats maxconn 1
        stats timeout 120s
    
    resolvers awsvpc
        nameserver vpc 172.20.0.2:53
    
    defaults
        mode        tcp
        log         global
        retries     3
        timeout     connect 10s
        timeout     client 1m
        timeout     server 1m
        timeout     check 10s
        maxconn     512
    
    listen mysql
        bind tsukada01:3306
        mode tcp
        option mysql-check user haproxy_check
    
        balance roundrobin
    
        option          log-health-checks
    
        server read01 dbserver01:3306 check port 3306 resolvers awsvpc inter 2000 fall 3
        server read02 dbserver02:3306 check port 3306 resolvers awsvpc inter 2000 fall 3

    もう片方のサーバは今の通りに設定した

    $ cat /etc/haproxy/haproxy.cfg
    global
        log         tsukada02 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4096
        user        haproxy
        group       haproxy
        daemon
        stats socket /var/lib/haproxy/stats
        stats maxconn 1
        stats timeout 120s
    
    resolvers awsvpc
        nameserver vpc 172.20.0.2:53
    
    defaults
        mode        tcp
        log         global
        retries     3
        timeout     connect 10s
        timeout     client 1m
        timeout     server 1m
        timeout     check 10s
        maxconn     512
    
    listen mysql
        bind tsukada02:3306
        mode tcp
        option mysql-check user haproxy_check
    
        balance roundrobin
    
        option          log-health-checks
    
        server read01 dbserver01:3306 check port 3306 resolvers awsvpc inter 2000 fall 3
        server read02 dbserver02:3306 check port 3306 resolvers awsvpc inter 2000 fall 3

    ほとんど同じように見えるので差分をまとめると、以下のような違いだ

    これで

    • tsukada001の3306ポート
    • tsukada002の3306ポート

      に接続すると、dbserver01,dbserver02へラウンドロビンで接続されるようになった

    しかし、これでは当然tsukada001、tsukada002自体で障害が起きる可能性もある。

    ALBでバランシング

    tsukada001:3306、tsukada002:3306をALBに登録しラウンドロビンで登録した。

    これによりALBのエンドポイントが払い出され、それを各プログラムが参照するような形にして可用性を担保した。

    振り返って見て思うこと

    レガシーなDBでこの構成を組もうとすると、できないことはないが、登場人物がやたら多い。一番なのはauroraなどに移行し、本当に必要なことのみに集中できれば最高だ。

     

     

  • Enhanced networking with the Elastic Network Adapter (ENA) is required for the ‘t3.small’ instance type. Ensure that your instance ‘i-xxxxxxxx’ is enabled for ENA.

    Enhanced networking with the Elastic Network Adapter (ENA) is required for the ‘t3.small’ instance type. Ensure that your instance ‘i-xxxxxxxx’ is enabled for ENA.

    はじめに

    AWSでT3インスタンスがリリースされた。t2.smallを多く使っていたので、似たようなスペックを探したところ、t3.smallインスタンスというのを見つけた。

    t2.smallではCPUが1coreだったのが、t3.smallでは2coreになっているだけでなく安くなっている!

     

    t3.small CPU:2core MEM:2G 0.0272USD/hour
    t2.small CPU:1core MEM:2G 0.0304USD/hour

    https://aws.amazon.com/ec2/pricing/on-demand/?nc1=h_ls

    まさに「うまい、やすい、はやい」というやつだ。インスタンスタイプを変更しない理由はないので、OSを停止できるものから止め、インスタンスタイプを変更していったが、wordpressが動いているkusanagiサーバだけが変更できなかった。

    Enhanced networking with the Elastic Network Adapter (ENA) is required for the ‘t3.small’ instance type. Ensure that your instance ‘i-xxxxxxxx’ is enabled for ENA. が発生

    kusanagiのインスタンスタイプは変更できたが、起動時にエラーになった。

    どうやら Elastic Network Adapterというのがインスタンスで有効になっていないのが原因のようだ。

    では、新しくサーバを立てた場合はどうなるか確認したところ、t3インスタンスは同様の理由でグレーアウトされていた。

    結論

    とりあえずこのサーバだけはt2.smallで継続することにした

  • 自分のグローバルIPアドレスを確認する

    自分のグローバルIPアドレスを確認する

    はじめに

    内部通信で使うサーバやMacBookのアドレスはOSに付いているip addrなどのコマンドでわかるけど、残念ながらグローバルIPはOSを確認するコマンドはOSに付いていない。外部サービスに問い合わせ、自分のIPを聞くのが一般的だ

    自分のIPを確認する

    ブラウザで確認する場合

    https://www.cman.jp/network/support/go_access.cgi へアクセスすると、接続しているマシンのIPアドレスがわかる。他の拠点のスタッフにIPアドレスを確認するのによく使う。

    CUIで確認する場合

    $ curl -s httpbin.org/ip 
    {
      "origin": "123.12.1.11"
    }
    

    IPのみを取り出したい場合はjqコマンドを使うとIPのみ取り出せる。

    $ curl -s httpbin.org/ip | jq -r .origin
    123.12.1.11

     

  • 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`

     

     

  • 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

    その後安定稼働している

  • CloudWatchにログが送れずDISKが枯渇

    CloudWatchにログが送れずDISKが枯渇

    はじめに

    AWSで稼働しているAmazonLinuxのdiskサイズが枯渇した

    原因

    何かが肥大化しているのが通例なので、duコマンドで調べていったら

    /var/log/awslogs.log

    が数ギガ使っていたということにたどり着いた

    もちろんログローテートはしているが、数ギガ使っているというのは明らかに異常

    何がawslogs.logに書き込んでいるか。

    Linuxにある各種ログファイルを

    CloudWatchMonitoringScripts
    http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip

    を用いてCloudWatchに送っているが、このスクリプトが送信した情報は

    /var/log/awslogs.log

    に書かれる。これが肥大化していた

    どのようなエラー内容か

    /var/log/awslogs.log

    tailで見ると、以下のようなログが出力されていた。

    ClientError: An error occurred (AccessDeniedException) when calling the PutLogEvents operation: User: arn:aws:iam::****:user/**** is not authorized to perform: logs:PutLogEvents on resource: arn:aws:logs:ap-northeast-1:****:log-group:/var/log/cron/cron:log-stream:ALL

    AccessDeniedException

    をみて、awsコマンドの設定周りが怪しいとあたりがついた

    awsconfigについて

    前途した通り、LinuxサーバはCloudWatchMonitoringScriptsを用いてログを送付しているが、

    設定ファイルは/etc/配下に格納している。

    それぞれ、awsコマンドを使う上での環境設定ファイルと、監視対象のログを記載したファイル

    [plugins]
    cwlogs = cwlogs
    
    [default]
    region = ap-northeast-1
    aws_access_key_id=***
    aws_secret_access_key=***

     

    [general]
    state_file = value
    logging_config_file = value
    use_gzip_http_content_encoding = false
    
    [/var/log/maillog/maillog]
    datetime_format = %b %d %H:%M:%S
    file = /var/log/maillog/maillog
    buffer_duration = 5000
    log_stream_name = ALL
    initial_position = start_of_file
    log_group_name = /var/log/maillog/maillog

     

    設定自体は問題なさそう。

    原因

    /etc/awslogsが最初に呼ばれるわけではない。

    起動ユーザーの.awsディレクトリ配下が先に呼ばれる。

    そのため、.awsディレクトリが存在していると、

    ログが送れないなどの事象が発生する。

    [default]

    中身は[default]しか書かれていなかったが、設定ファイルが存在していた。

    これが存在していたことにより、/etc/awslogsディレクトリが読み込まれず、Cloudwatchに送付できていなかったようだ。

    対処

    空の.awsディレクトリを削除し、awslogsを再起動

    正常にcloudWatchにログが送付され、DISKの肥大化も解消した

    参考情報

    本記事のみならず、AWSについて体系的に学ぶことができるのでおすすめ。

  • awsコマンドでLoadAverageが高騰してEC2にログインできない

    awsコマンドでLoadAverageが高騰してEC2にログインできない

    Amazon Linuxに30分後にログインできなくなる問題が発生。

    サーバの構築自体はAnsibleを使って複数台同じ手順で作っているので、中身は一緒のはず。原因を調べた。 (さらに…)