Tag: EC2

簡単な EC2 インスタンスのバックアップ機構を作る

日次で自動的に cron で再起動して、AMI イメージを取得したい。 再起動が必要だが再起動時はメンテナンス画面を出しておきたい( 深夜メンテナンス時間が取れるサービスに限る ) ALB でメンテナンス画面を出せる機能を用いてサーバ終了、起動時にメンテナンス画面に切り替える

仕組み

  1. EC2 上で自分自身のイメージを取得するスクリプトを用意する
  2. EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する
  3. EC2 サーバの crontab にスクリプトを用意する
  4. 起動終了時に ALB のルールのプライオリティを変更する処理を組み込む

EC2 上で自分自身のイメージを取得するスクリプトを用意する

/usr/local/bin/ami_backup.bash に下記のスクリプトを設置した。

#!/bin/bash

id=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
/usr/bin/aws ec2 create-image --region ap-northeast-1 --instance-id $id --name "wordpress-www-update-$id-$(date +%Y%m%d%H%M)" --reboot

wordpress-www-update の部分はシステムによって変えた方が良いと思う。 あるいは$id にインスタンス名が入るので、それを持ってユニークとするか( ただし検索が面倒 )

EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する

下記のロールを持つように IAM を作成、EC2 サーバーに付与

  • elasticloadbalancing はロードバランサーのルールのプライオリティの上下に使う
  • ec2 は AMI の作成に使う
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:DescribeRules",
                "elasticloadbalancing:SetRulePriorities",
                "ec2:ExportImage",
                "ec2:DescribeImages",
                "ec2:DeleteTags",
                "ec2:EnableImageDeprecation",
                "ec2:CreateTags",
                "ec2:RegisterImage",
                "ec2:CreateImage",
                "ec2:ModifyImageAttribute",
                "ec2:CreateStoreImageTask",
                "ec2:DisableImageDeprecation"
            ],
            "Resource": "*"
        }
    ]
}

EC2 サーバの crontab にスクリプトを用意する

AM 03:01 に実施

Read more...

ALBだけでメンテナンス画面を表示させる際の注意

なるべくサービス側のシステムを触らずにALBだけでメンテナンス画面を出したかった

参考: FixedResponseActionConfig (ALB)

• Fixed response のメッセージボディは 1024 バイトまで

• HTML を入れる場合はサイズ制限が厳しいので、必要なら minify して縮める

• CDNキャッシュ初期化は必要なドメインすべてで行う必要がある

Read more...

AWS EC2 オートスケール

EC2のオートスケールは、EC2のWebUIの下記の要素で作成する

  • AMI <- ami-idを確認する
  • AUTO SCALING
  • 起動設定 <- 主にEC2の起動設定、どのAMIからEC2インスタンスを作成する、spotインスタンスにするか、など。複数作成して切り替える事が可能。
  • Auto Scalingグループ <- 主にネットワーク周りの設定

起動設定を作ってから、AutoScalingグループを作成する。 [ AutoScalingグループ ]には「どのAMIからEC2インスタンスを作成するか」という[ 起動設定 ]を切り替えることができる。

高負荷時のオートスケールにかかる時間は5分から6分程度、EC2インスタンス起動に通常、120秒ほどかかる事を考えると、 負荷の検知、スケールアウト準備、インスタンス起動、サービス開始、と妥当な時間のように思う。

が、ライブ開始前と21:00の負荷の際にはあらかじめサーバを足しておきたい。この設定は [ AutoScalingグループ ]->[ スケジュールされたアクション ]で設定可能。

※ このスケジュールされたアクションを設定する際の [ 開始時刻 ]の注意点は

  • デフォルトで翌日の設定になってる
  • 一度開始時刻を設定しようとすると、CRONの設定が消える という点が注意点。スケジュールが実行されないケースがあった。

実際にスケジュールが実行されたかどうかは[ アクティビティ履歴 ]を見ると分かる

Read more...

AWS EC2メモ

インスタンスタイプごとのネットワーク帯域

iperfなどで計測する。

iperf -c %LOCAL_IP_ADDRESS% -t 60

EC2 – EC2 間 は5Gbps程度 参考 水門は開いた – EC2 インスタンスのネットワーク帯域幅が増大

起動時、パッケージのセットアップがうまく行かない場合

/etc/sysconfig/cloud-init の package_setupの項目をnoにする。

参考 VPC内にEC2を立ち上げようとしてcloud-initのpackage_setupでハマる

チェックポイント

EC2
  • 余計なセキュリティグループがついてないか、つまり余計なポートが空いてないか

  • opsに余計なのがついてたり( port 22 が、まだ空いていたり )

  • AZ分散しているか?

  • たまに「サブネットを作ってなかった」というミスがあり、この場合、サブネットが寄ってしまっている。

  • opsにはEIPが割り当てられているか

  • パラメータストアにSLACKの値は設定しているか

ロードバランサー
  • port 443 でリスナーが立っているか?

  • 『CloudFront障害』のケースを考えると、オリジン側もHTTPではなくSSLで受ける必要がある。

  • Deletion Protection をonにする。削除されなくするやつか

ターゲットグループ

ELBのtarget groupにおける stickness が無効になってたので30秒で有効に変更する

EC2 上に Nginx + PHP + Phalcon 構築手順

nginxの UID:GIDを揃える

下記のファイルで必要になる。 UID:GID統一の方法としては

  1. NIS or LDAP 導入
  2. 追加するアプリのUID:GID全て統一
  3. 必要なアプリのUID:GID統一 があるが、今回は3にした。基本的には『サーバ間でファイルをコピーする場合』にUID:GIDが揃ってないと、動作しないので。 ( 上場してパスワード更新が求められるようになったらldap導入するか検討しても良いかもしれない )

パッケージインストール

git インストール
yum -y install git gcc make libtool

カーネルパラメータ追加

sudo vi /etc/sysctl.conf

下記を追記

Read more...

AWSマーケットプレイスでのイメージ検索

AMI( HDDイメージのようなもの )の選択

AMIの選択はEC2を起動する際やここから検索できる ただ検索できた方が、なにかと自動化しやすい( わざわざブラウザで開かなくて良い )ので方法を残す

例えばAMI名に『KUSANAGI』を含むAMIを検索する場合

aws ec2 describe-images \
  --region ap-northeast-1 \
  --owners 'aws-marketplace' \
  --filters 'Name=name,Values=*KUSANAGI*'

例えば Amazon Linux の最新AMI IDが欲しい場合

Amazon Linux は SSM パブリックパラメータから取得する方が確実。 公式: Amazon Linux 2023 の AMI を取得する

Amazon Linux 2023 (x86_64) の例:

aws ssm get-parameter \
  --region ap-northeast-1 \
  --name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
  --query 'Parameter.Value' \
  --output text

Amazon Linux 2 など他の系列は、該当するパラメータ名を公式一覧から確認する。

プロダクトコード、オーナーで検索する場合

「あるオーナーの更に、プロダクトごとに絞り込みたい」ようなケース。

オーナーは、大雑把にいうと「Amazonが所有者のもの( amazon )」と「それ以外( aws-marketplace )」な区分がある。

Read more...