Using JSON with MySQL 5.7–compatible Amazon Aurora | AWS Database Blog

Using JSON with MySQL 5.7–compatible Amazon Aurora | AWS Database Blog. 1 users テクノロジー 記事元: Amazon Web Services … Amazon Relational Database Service – Looking Back at 2017 | AWS News Blog · 3 usersaws.amazon.com … 続きを読む

バックエンドエンジニア

【開発体制】 アジャイルな開発体制としてスクラムを採用 【開発環境】 □言語:PHP(フレームワーク:FuelPHP)□環境:Linux(AWS EC2 ), Apache □DB : MySQL□バージョン管理:Git, GitHub□メール配信 : AWS SES□画像サーバ: AWS S3□CDN : AWS CloudFront□キャッシュ : AWS ElasticCache□その他 : RDS, … 続きを読む

AWSのEC2とRDS(mysql)を他アカウントへ移行してみるテスト

方針

ちょっとだけサーバを止める
移行前=>VPC1 / AP1 / DB1
移行後=>VPC2 / AP2 / DB2
って名前にする
ロードバランサなどについては特に記述しない

移行手順

  • VPC2を作る
  • VPC2とVPC1をピア接続する
  • AP2を作る
  • AP2からDB1へ接続する
  • DNSサーバをAP1からAP2へ向き先を変える
  • 浸透を待ち、AP1止める
  • DB2を作る
  • DB1からDB2へDBを移行(ダンプとかで)
  • データ移行が終わった段階で、AP2を止める
  • AP2の向き先をDB2へ変更
  • DB2を親にする
  • AP2を起動する
  • (゚∀゚)

作成

vpc2を作る

以降元とprivate-ipが被らないようにする

ピア接続

こちらを参考に作成しました
https://dev.classmethod.jp/cloud/aws/vpc-peering-different-awsaccount/

  • vpc2からvpc1へピア接続を作る
  • vpc1のアカウントIDとvpc-idを設定する
  • vpc1アカウントのvpc=>ピア接続で、リクエストを承認する
  • vpc1とvpc2双方のルートテーブルへ、お互いのip範囲でターゲットなピア接続を追加

EC2の移行

こちらを参考に作成しました
http://keisukeohta.hatenablog.com/entry/2016/03/01/210556

  • AP1のインスタンスからイメージを作る
  • AMIのイメージパーミッションの設定で移行先アカウントIDを追加する
  • 移行先アカウントのAMI=>プライベートイメージに共有されているので、それを使ってEC2を作成
  • ap2からdb1へピア接続出来ることを確認する
    => db1がパブリック接続許可の場合、パブリックIDで接続しに行ってしまうので、ローカルIDで接続する

以上

これで「AP2からDB1へ接続する」から先が作業可能となります

続きを読む

AWS DMSを使ってRDS for PostgresからDynamoDBにデータ移行

はじめに

Postgresqlに保存してあったデータをDynamoDBに移行させるために、AWSのDMS(Database Migration Service)を使ってみた時の、メモをまとめた記事である。

背景

クローリングしたデータをRDS for Postgresqlに保存していて、そのデータの利用してAPI GatewayとLambdaを使ってAPIサーバを作成しようと思っていたのだが、RDSとLambdaは相性が良くないということが判明した(接続数の問題などで)。
しかも、DynamoDBを使えば、エンドポイントがつくられるので、わざわざLambdaで関数作る必要無いことに気がついたので、RDS to DynamoDBへの移行計画を立てることにした。

調べているとAWS DMSという、いかにもなサービスがあったので使ってみることにしたというのが、事の顛末である。

AWS DMSについて

AWS DMS(Database Migration Service)は、Databaseの移行を簡単に行えるサービスである。
Mysql to Mysqlのような同種DB間のデータ移行にも当然対応しているが、Postgresql to DynamoDBのような異種DB間のデータ移行にも対応している。
利用シーンとしては、オンプレのMySQLサーバをRDS for MySQLに移行する際や、RDS for PostgresqlをAurora for Postgresqlに移行する際に使用する。
また、一度だけのデータ移行にも使えるが、継続的なレプリケーションにも対応しているので、開発/テスト環境の同期などにも使うことができる。
ちなみに、Aurora、Redshift、DynamoDBに移行する場合はDMSを6ヶ月間無料で使うことができる。今回はDynamoDBに移行させるので、試すにはピッタリだった。

移行手順

1. レプリケーションインスタンスの作成

DMSでデータ移行するためにはレプリケーション用のインスタンスを作成する必要がある。
これは、DMSの設定画面から簡単に設定できる。

AWSコンソールから
「Database Migration Service >> レプリケーションインスタンス >> レプリケーションインスタンスの作成」
を選択。

すると以下のような画面が出てくる。
image.png

  • 名前:

    • レプリケーションインスタンスの名前
  • 説明:
    • レプリケーションインスタンスの説明
  • インスタンスクラス:
    • EC2でいうインスタンスタイプ
    • 2018年1月現在ではt2とc4インスタンスが選べる
    • 料金はこちら
  • レプリケーションエンジンのバージョン:
    • バージョン2.4.0を選択するとデータの検証ができるらしい
    • 古いものを選ぶ理由は今のところ無いので新しいバージョンを選ぶ
  • vpc:
    • レプリケーションインスタンスを置くvpc
    • 移行元か移行先どちらかのvpcに置くと色々と楽
      • ちなみに、移行元か移行先のどちらかがAWSサービスでないとDMSは使用できない
  • マルチAZ:
    • レプリケーションインスタンスをマルチAZ配置にする場合有効にする
  • パブリックアクセス可能:
    • レプリケーションインスタンスをインターネットアクセス可能にする場合有効にする
    • VPCでサブネットやインターネットゲートウェイをしっかりと設定しているのであれば有効にする必要がない(はず)

2. ソースエンドポイントの作成

ソースエンドポイントでは移行元のDBへのアクセス方法を設定する。
今回はRDS for Postgresqlが移行元DBになる。

AWSコンソールから
「Database Migration Service >> エンドポイント >> エンドポイントの作成」
を選択。

すると以下のような画面が出てくる
image.png

  • エンドポイントタイプ:

    • ソースかターゲットを選択
    • 移行元がソースなので、ここではソースを選択
  • エンドポイント識別子:
    • 作成するエンドポイントの名前
    • 同じ名前のエンドポイントは作成できない
    • 名前が同じでなければなんでも良い
  • ソースエンジン:
    • 移行元のデータベースエンジン
    • 今回はPostgresqlなので、postgesを選択
  • サーバ名:
    • 移行元のサーバ名
    • オンプレの場合であれば、そのサーバのアドレス
    • RDSであれば、インスタンスのエンドポイントを入力すれば良い
  • ポート:
    • 移行元DBのポート番号
    • 今回はPostgresのデフォルトポートの5432を入力
  • SSLモード:
    • 移行時の通信を暗号化するかを選択する
    • SSLを有効にした場合には、安全にはなるがオーバーヘッドが増えるので必要化判断して有効化すること
    • 選択した項目によりサーバ証明書が必要になる
    • 選択項目は以下の4つ
      • none: 暗号化しない
      • require: 暗号化される。証明書は不要。
      • verify-ca: 暗号化される。証明書が必要。
      • verify-full: 暗号化される。証明書とサーバのホスト名が一致するか確認される
  • ユーザ名
    • 移行元DBのユーザー名
    • ここでマスターユーザを選択しないと色々と面倒なので、マスターユーザを選択すること
  • パスワード
    • 先程選択したユーザのパスワード
    • 「&」や「+」のような記号はエスケープしないと使えない
    • 「&」や「+」が入る場合は全てを波括弧「{}」で括ること
  • データベース名
    • 移行したいデータベース名

一通りの設定をした後、接続テストができる。
ここで接続する元は、先程作成したレプリケーションインスタンスになるため、セキュリティーグループやファイアーウォールでアクセス制限をしている場合は、レプリケーションインスタンスがアクセスできるようにする必要がある。

3. ターゲットエンドポイントの作成

こちらでは移行先のDBのアクセス方法を設定する。
今回の移行先はDynamoDBになる。

設定方法は基本的にソースエンドポイントと同じだが、ターゲットエンドポイントにDynamoDBを設定した場合には、サービスのアクセスロールだけ指定すれば簡単に設定することができる。

AWSコンソールから
「Database Migration Service >> エンドポイント >> エンドポイントの作成」
を選択。

エンドポイントタイプをターゲットを選択し、ターゲットエンジンをDynamoDBにすると、以下のような画面が出てくる。
image.png

  • エンドポイント識別子:

    • エンドポイントの名前
    • 既に作成済みのエンドポイントと重複しなければ良い
  • ターゲットエンジン:
    • 移行先のデータベース
    • 今回はdynamodbを選択
  • サービスへのアクセスロールのARN
    • DynamoDBのアクセス権限があるIAM RoleのARN
    • ポリシーは細かく設定できるけど、めんどくさかったので以下のポリシーをアタッチ
      • AmazonDynamoDBFullAccess
      • AmazonDMSVPCManagementRole(いらないかも…?)

これも、必ず接続テストを行うこと。
DynamoDBに関しては、設定したロールが正しいアクセス権限を持っていれば問題なく接続できる(はず)

4. タスクの作成

移行するための最後の設定としてタスクを作成する。

AWSコンソールから
「Database Migration Service >> タスク >> タスクの作成」
を選択。

すると以下のような画面が出てくる。タスクの設定だけはちょっと長いので分割して説明する。
image.png

  • タスク名:

    • タスクの名前
    • これはなんでも良い
  • レプリケーションインスタンス:
    • このタスクで使用するレプリケーションインスタンス
    • 今回は 1. で作成したものを使用する
  • ソースエンドポイント:
    • このタスクの移行元となるエンドポイント
    • 今回は 2. で作成したものを使用する
  • ターゲットエンドポイント:
    • このタスクの移行先となるエンドポイント
    • 今回は 3. で作成したものを使用する
  • 移行タイプ:
    • このタスクで継続的にデータのレプリケーションを行うか設定する
    • 項目は以下の3つ
      • 既存のデータを移行する

        • 初回の移行のみ実行する
      • 既存のデータを移行し、継続的な変更をレプリケートする
        • 初回の移行を実行し、その後も継続的にレプリケートされる
      • データ変更のみをレプリケートする
        • データ変更のみをレプリケートされる
        • 通常、同種DB間の移行にのみ適用されるらしい
        • どういう時に使うかはよくわからなかった
    • 今回は、一度だけ移行ができれば良いので、「既存のデータを移行する」を選択
  • 作成時にタスクを実行
    • タスクの作成と同時にタスクを実行したければチェックをつける

次はタスク設定の画面
image.png

  • ターゲットテーブル作成モード:

    • タスク実行時に移行先のテーブルをどうするかを設定する
    • 設定項目は以下の3つ
      • 何もしない

        • 移行先にテーブルがない場合作られる
      • ターゲット上のテーブルをDROP
        • 移行先のテーブルを全部DROPする
      • TRUNCATE
        • メタデータに影響を与えないよう、TRUNCATEされる
  • レプリケーションにLOB列を含める:
    • データ移行の際にLOB(Large Object)を含めるか設定する
    • 画像をバイナリで保存している際などに、そのデータを移行するか設定する
    • 以下の設定項目がある
      • LOB列を含めない

        • LOB列を移行対象から外す
      • 完全LOBモード
        • サイズに関係なくLOB列を移行対象に含める
        • チャンク単位で送信するため、低速
      • 制限付きLOBモード
        • 次で設定する最大LOBサイズ以上のデータを削除して送信する
        • 完全LOBモードに比べると高速
  • 最大LOBサイズ(KB):
    • レプリケーションにLOB列を含めるに制限付きLOBモードを選択した時の最大LOBサイズ
  • 検証の有効化:
    • 移行元と移行先でデータを比較し検証するかどうかを選択する
  • ロギングの有効化:
    • 移行時のログをCloudWatch Logsに吐くかを選択する

最後にテーブルマッピングの設定
image.png

  • 選択ルールを設定する。
  • このルールに基いて、除外するテーブルやカラムを決定する。
  • ワイルドカードを使用できるので、まぁまぁ柔軟に設定できそう。
  • 最低一つは設定しなければいけないっぽい。
  • 一旦、デフォルトの状態のまま選択ルールの追加する。
  • 選択ルールを一つでも追加すると、変換ルールも追加できるようになる。
    • 名前の変更とか、テーブルや列の削除しかできないので、結構限定的。

以上が全て設定できたら、タスクの作成ボタンを押下。
「作成時にタスクを開始」にチェックが入っている場合にはすぐにタスクが実行される。

所感

実際にAWS DMSを使ってみて、かなり簡単に異種DB間のデータ移行を実現することができた。
データ量もあまり多くなかったため、10分程度で全てのデータ移行が完了していた。
コストも今回は無料だったし、実際に課金されても低コストで使用することができそう。

実際にDynamoDBを見てみるとPostgresqlにあったテーブルが作成されていた。
しかし、いくつかカラムが消えていたので、まだ調査が必要そうだ(LOB列と判断された…?)。

参考

続きを読む

MySQL にアクセスする Lambda 関数 (Python3)

python3 で MySQL にアクセスする AWS の Lambda 関数を書いてみました。
ライブラリーは、pymysql を使います。

mysql_scan.py
# -*- coding: utf-8 -*-
#
#   mysql_scan.py
#
#                   Jan/27/2018
# --------------------------------------------------------------------
import  sys
import  json
#
from mysql_scan_exec import mysql_scan_exec_proc
# --------------------------------------------------------------------
def mysql_scan_handler(event, context):
    sys.stderr.write("*** mysql_scan_handler *** start ***n")
#
    table_name = "No table_name"
#
    sys.stderr.write("Received event: " + json.dumps(event, indent=2) + "n")
    if ('table_name' in event):
        sys.stderr.write("table_name = " + event['table_name'] + "n")
        table_name = event['table_name']
#
    version = "Jan/27/2018 PM 18:46"
    sys.stderr.write("version: " + version + "n")
#
    sys.stderr.write("*** mysql_scan_handler *** ccc ***n")
#
    rvalue = mysql_scan_exec_proc(table_name)
#
    sys.stderr.write("*** mysql_scan_handler *** end ***n")
#
    return rvalue
# --------------------------------------------------------------------
mysql_scan_exec.py
# -*- coding: utf-8 -*-
#
#   mysql_scan_exec.py
#
#                   Jan/28/2018
# --------------------------------------------------------------------
import  os
import  sys
import  json
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'api'))
import pymysql
#
from mysql_config import mysql_config_proc
# --------------------------------------------------------------------
def mysql_scan_exec_proc(table_name):
    rvalue = []
    connection = mysql_config_proc()
    cursor = connection.cursor()
#
    sql_str="select * from " + table_name
    sys.stderr.write("sql_str = " + sql_str + "n")
    cursor.execute (sql_str)
    rows = cursor.fetchall ()
#
    cursor.close()
    connection.close()
#
    return rows
# --------------------------------------------------------------------
mysql_config.py
# -*- coding: utf-8 -*-
#
#   mysql_config.py
#
#                   Jan/28/2018
# ---------------------------------------------------------------
import os
import sys
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'api'))

import pymysql
# ---------------------------------------------------------------
def mysql_config_proc():
#
    host_aa='test_aa.abcdefghijkl.ap-northeast-1.rds.amazonaws.com'
    data_base = 'city'
    user_aa ='scott'
    password_aa = 'tiger123'
#
    connection = pymysql.connect(host_aa, user=user_aa, 
        passwd=password_aa, db=data_base, 
        cursorclass=pymysql.cursors.DictCursor, connect_timeout=5)
    return connection
#
# ---------------------------------------------------------------

ラムダ関数の作成手順
api というフォルダーに pymysql を保存

mkdir api
pip install PyMySQL -t ./api

ラムダ関数を作成するスクリプト
morning_exec_role というロールが作られているとします。

function_create.sh
#
FUNCTION='mysql_scan'
ZIP_FILE=$FUNCTION".zip"
#
zip -r $ZIP_FILE $FUNCTION".py" mysql_config.py mysql_scan_exec.py api
#
#
aws lambda create-function 
    --function-name $FUNCTION 
    --runtime python3.6 
    --role arn:aws:iam::123456789012:role/morning_exec_role 
    --handler $FUNCTION.mysql_scan_handler 
    --zip-file fileb://$ZIP_FILE 
    --region ap-northeast-1
#

Lambda 関数を更新するスクリプト
(何かを変更した時に使います。)

function_update.sh
#
FUNCTION='mysql_scan'
ZIP_FILE=$FUNCTION".zip"
#
zip -r $ZIP_FILE $FUNCTION".py" mysql_config.py mysql_scan_exec.py api
#
#
aws lambda update-function-code 
    --function-name $FUNCTION 
    --zip-file fileb://$ZIP_FILE
#

続きを読む

オンプレMySQLからAuroraへの移行で躓いたポイント(その3・移行後)

この記事は以下の記事の続きです。

一部、内容がその2と被りますが、移行後に生じた問題…というよりは、移行段階から移行後までずっと引きずっていた問題について触れていきます。

【注意】

  • ここで示した対策をそのままプロダクト環境に適用しているとは限りません。大抵はもう少し手を加えて適用しています。
  • 一部「これからプロダクト環境に適用する予定」のものもあります。

移行後まで引きずった問題点

ずばり、その2で記した「複数スレッドでのパフォーマンス問題」です。

移行前と移行後を比較すると、Webサーバの台数は1.5倍に増やしました。1台当たりの搭載メモリも1.5倍に増やしましたが、一方で仮想CPUのコア数は1台当たりで半分にしました。

「あれ?G1GC使ってるDBCP2のEvictionも走ってるのにコア減らしていいの?」となりそうですが、実際、r4.largeとm4.xlargeで結果の差が全くといっていいほど出ませんでした(同じような負荷レベルで処理が詰まる)。r4.largeでもCPU使用率が30~35%程度までしか行かず…腑に落ちないまま移行リリース。

移行当日は土曜日だったので負荷はあまりなく(でもリリース直後は普通の土曜日よりアクセスが多かった)特に問題は出ませんでしたが、最初の営業日、やはりWebサーバが1台、処理が詰まって落ち、再起動しました。
※50xエラーが一定期間に閾値以上発生したら再起動するように仕込んでありました。

しばらく様子見していましたが、頻繁ではないものの週に1回から数回、Webサーバが落ちます。アクセスログを見ると、不正なアクセスではなく正規のユーザが、

「以前より反応が遅くなったので、画面を何度かリロード」

しているようだったので(一部「イラついて連打」している人もいたりいなかったり?)、最初は画面で「処理中」表示を行い操作を抑制するとともに、WAFで過剰なアクセスを遮断する対応を行いました。

時間稼ぎ(?)の対策を開始

しかし、WAFでは「閾値を低くしすぎると正常なアクセスを遮断してしまう」こともあり、あまり効果的にリロードを抑制できず。画面表示での(心理的な)抑制も、処理の進行状況を表示しないとかえって逆効果になることも(ケースバイケースですが)。

この時点ではまだ「オンプレ時代より遅い」ことの正確な原因(Web~DB間のネットワークレイテンシが影響していることはまず間違いはなかったのですが)は把握できておらず、解決が長引きそうだったので、

  • Webサーバをさらに増やしてオンプレ時の2倍に
  • Aurora DBクラスタのWriterがあるゾーンとは別のAZにレプリカ(Reader)を設置し、SELECT負荷が高いアプリケーションを一部修正してReaderにアクセスするように

するとともに、

  • 「処理が詰まる」とはいっても「特定のWebサーバ」の「負荷が高くなったアプリケーション単体」でDBアクセスが詰まっており、ほかのWebサーバはそのまま動き続け、同じWebサーバでも別のアプリケーションはしばらく動作を続けていた(DBへのコネクションプーリングはWebアプリケーション個々で分けて張っていたため)

ことから、閾値以上の50xエラーが出たときにWebサーバを単純に再起動するのではなく、ALBのDrainingを使って再起動し「巻き込み被害」を極力減らす対応を行いました。

※タイトルがわかりにくくてごめんなさい(どう表現したらよいかわからず…)。

また、

  • 「負荷が高い画面」の処理であっても、利用ユーザによって処理するデータ量に差があり、結果として処理時間に大きな開きがある。一律に「単位時間当たりのリクエスト数」を制限しても(WAFによる遮断と同様に)うまくいかない

ので、「負荷が高い画面のリクエストを受け付けた時点からレスポンスを返しきるまで」を「1」とカウントし、(ユーザ毎に)並行処理(カウント)数が閾値以上になっているかどうかを見て遮断するように、JavaのローカルキャッシュとTomcatのサーブレットフィルタを使って対応しました。

※こちらも上に同じ。タイトルを付けるのは難しい。

なお、この対応を行っている最中、正規のユーザが「遅さに慣れた」(リロードしまくるとかえって遅くなることに気づいた)ことで、処理が詰まってWebサーバが再起動することはほぼなくなりました。但し、遅い状態が解消されたわけではないので、対応が不要になったわけではありません。

Meltdownパッチで動揺、そして問題解決

2018年1月になり、Meltdown&Specterの騒ぎが発生、AWSもEC2やAuroraなど関係するクラウド基盤サーバにパッチを当てたようです。その結果、「サーバ性能低下」という事案が発生しました。

ベンチマークを取りつつ急いで利用中AuroraインスタンスのバージョンアップとR4への移行を行いましたが、作業直前にほぼ元の性能に戻っていました(振り回された…)。

ただ、ここでベンチマークを取りながら別の対応策を検討。移行リリース前、コネクションプールをDBCP2からTomcat JDBC Poolに移行しようとして失敗して時間切れになっていましたが、今度はHikariCPへの移行にトライ。
※「ステージング環境での負荷テスト結果はともかく、プロダクト環境で処理が詰まるのはDB(Aurora)側が原因ではなさそうだけど、DBへの問い合わせで詰まっていることは間違いない」というところまでは絞り込んでいましたので、行き当たりばったりの対応ではありません(多分。おそらく。きっと)。

結果、これがうまくハマってオンプレ時と同等(一部はそれ以上)の性能を取り戻すことができました。

Auroraフェイルオーバー時の処理の詰まりもなくなりました。

また、これで(現状の負荷なら)Webサーバの台数も元に戻すことができます。

AWSのネットワーク環境は、同一AZであってもインスタンス間のレイテンシ(遅延)が往復平均で200マイクロ秒(μs)程度あるようです(OS上で計測した場合)。これは、同じ室内に1ラック~数ラック立てて運用しているオンプレ環境(特にSDNを使っていない環境)とは1桁以上の差があります(オンプレが速い)。

通常のSQLクエリ/コマンドの実行では大した影響がなくても、コネクションプールでは接続のValidationやEviction等の際に確認クエリを発行する上、MySQL Connector/Jも色々と管理・確認用のクエリを流しがちな傾向があるので、わずかな処理時間の増加でもリソースの取得・開放がスムーズにいかない原因になります。

そこを、HikariCPにしたことで処理が軽減されて(クエリ発行数も減ったはず)、AWS環境でもうまく回るようになったようです。

なお、途中では触れませんでしたが、負荷を軽くするには「遅いSQLの改善」も重要です(当然、その対応も進めていました)。

HikariCPでWebサーバの動作が軽くなったことで、今度は「遅いSQLを処理するときのDB負荷」のほうにボトルネックが移りました。これまで以上にSQLの改善、INDEXやテーブル設計の調整などに力を入れる必要がありそうです。

まとめ

  • ユーザは「遅くなった」ことには割と敏感に気づき、そして(気軽に?)画面をリロードする
  • 一方で、「遅くなった」ことにはしばらくすると慣れる(限度はあるし、ユーザの時間を無駄に奪ってはいけない)
  • ちょっとしたレイテンシの変化が処理のサイクル・バランスを大きく崩すことがある(オンプレで実績がある構成でも、そのままで行けるとは限らない)
  • ボトルネックを1つ解消すると、別のところにボトルネックが移る(ので、移った先の対応を進める必要がある)

続きを読む

Amazon Linux 2 で Rails アプリケーションのサーバーを構成してみる

Amazon Linux 2 の特徴

  • AWS INTEGRATION

    • AWS tools (e.g. AWS CLI) と cloud-init が入った
  • LONG TERM SUPPORT
  • EXTRAS REPOSITORY FOR SOFTWARE PACKAGES
    • amazon-linux-extras で nginx などのパッケージを管理できる
  • ON-PREMISES USE
    • オンプレ利用用途に VM Image などが用意されている
  • SYSTEMD SUPPORT
  • TUNED LTS KERNEL AND NEW TOOLCHAIN
  • SECURITY CONFIGURATIONS
  • SECURITY UPDATES

インスタンスの作成

AMI 選択画面で Amazon Linux 2 LTS Candidate AMI 2017.12.0 (HVM), SSD Volume Type (ami-c2680fa4) を選択してインスタンスを立てる.

公開鍵の追加

vi ~/.ssh/authorized_keys

ユーザーの追加

sudo adduser deploy

ライブラリのインストール

sudo yum -y install 
git make gcc-c++ patch 
openssl-devel 
libyaml-devel libffi-devel libicu-devel 
libxml2 libxslt libxml2-devel libxslt-devel 
zlib-devel readline-devel 
mysql mysql-server mysql-devel 
ImageMagick ImageMagick-devel 
epel-release protobuf-devel

デプロイ先フォルダの用意

sudo mkdir /var/www
sudo chown deploy /var/www/
sudo mkdir /var/www/deploy
sudo chown deploy /var/www/deploy/

nginx のインストール

Amazon Linux 2 では amazon-linux-extras で入れる.

# 確認する
amazon-linux-extras
# install する
sudo amazon-linux-extras install nginx1.12
# ついでに emacs も入れる
sudo amazon-linux-extras install emacs

nginx の起動

# 起動
sudo systemctl start nginx.service
# ステータスの確認
sudo systemctl status nginx.service
# systemd を有効化
sudo systemctl enable nginx.service
# 有効になっているか確認
systemctl is-enabled nginx.service

nginx の設定

# nginx の設定ファイル
sudo vi /etc/nginx/nginx.conf
# 設定再読込
sudo nginx -s reload

ffmpeg

sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
mkdir ~/tmp
cd ~/tmp
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum -y localinstall epel-release-latest-7.noarch.rpm
sudo yum -y install ffmpeg ffmpeg-devel

wkhtmltoimage

https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
tar -xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
sudo mv wkhtmltox/bin/wkhtmltoimage /usr/bin/wkhtmltoimage

NodeJS

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
source ~/.bashrc
nvm install v8.9.4
nvm use v8.9.4
nvm alias default v8.9.4

Ruby

sudo git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
sudo git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugin/ruby-build
sudo /usr/local/rbenv/plugin/ruby-build/install.sh
sudo vi /etc/profile.d/rbenv.sh
sudo su -
source /etc/profile.d/rbenv.sh
rbenv install 2.4.3
rbenv global 2.4.3
gem install bundler --no-ri --no-rdoc

タイムゾーン, host の修正

timedatectl, hostnamectl を利用する.

sudo timedatectl set-timezone Asia/Tokyo
sudo hostnamectl set-hostname deploy.dot.com
sudo reboot

New Relic Infrastructure の追加

https://rpm.newrelic.com/accounts/813076 でライセンスキー確認

echo "license_key: YOUR_LICENSE_KEY" | sudo tee -a /etc/newrelic-infra.yml
sudo curl -o /etc/yum.repos.d/newrelic-infra.repo https://download.newrelic.com/infrastructure_agent/linux/yum/el/7/x86_64/newrelic-infra.repo
sudo yum -q makecache -y --disablerepo='*' --enablerepo='newrelic-infra'
sudo yum install newrelic-infra -y

公開鍵

sudo su - deploy
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# デプロイするサービスの公開鍵を追加
vi ~/.ssh/authorized_keys

refs

続きを読む

AWS Mysql に IAM Role で接続する

MySQL 5.6 マイナーバージョン 5.6.34 以降、MySQL 5.7 マイナーバージョン 5.7.16 以降、Amazon Aurora 1.10 以降 で対応している。ただし、1秒間あたりの接続開始の認証回数が20回と少ないため、アクセスの多いシステムでは採用できない。 IAM データベース認証の制限Lam… 続きを読む