信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    Deployerでも動的にデプロイするホストを変更したい!

    ↑ってなりますよね?なるなるーホストが固定だと、deploy.phpにホストを書いて終わり、ってなるんですけど、AWSなどで今動いてるホストがコロコロ変わるとしたらdeploy.phpには固定で書けないですね。うーんこまったどうしよう。そんなときはこれ!hosts.yml〜くわしくはこちら!https://deployer.org/docs/hosts.htmlhosts.ymlにしたがってデプロイするよってしておけば、hosts.ymlを事前に生成すれば動的にできるんだ!(deploy.phpには inventory('hosts.yml');って書けば使われるよ。まあリンク先↑に書いてある。)なんだって!すごいね!はいソース の 例。pythonのほうが楽なんだけどいじりやすいようにphpにしましたですよ?雛形(SOURCE_hosts.yml)をつくっておいて、それのIPとインスタンスIDをリプレースしてるっす。わかるっすよね。雛形はじぶんでつくってね!(リンク先参照とかテストとかして)対象EC2はタグで絞り込んだりとかもしてます。これを使ってなにかあっても責任は全く取れませんなので十分に検証してね!hosts.yml生成するだけですけど。これをjenkinsに呼ばせるなら、失敗時はexit(1);とかすれば進まないのでは。ではいいかんじのDeployerライフを。<?php require 'aws_v3.phar'; use Aws\Ec2\Ec2Client as Ec2Client; use Aws\Exception\AwsException; echo 'generate_autoscale_yml START' . PHP_EOL . PHP_EOL; /**設定箇所 開始**/ //認証情報 $auth = [         "key"   => "ああああ",         "secret" => "いいいい",         "region" => "ap-northeast-1",         "version" => "2016-11-15", ]; //タグ、AutoScaleGroupの値 $AutoScaleGroup_value = 'もがもが'; //hosts.ymlの雛形となるものを読んでおく $source_hosts_yml_string = file_get_contents('./SOURCE_hosts.yml', FILE_USE_INCLUDE_PATH); //結果ファイル名 $hosts_yml_filename = './hosts.yml'; /**設定箇所 終了**/ //hosts.ymlに結果として書き出す文字列の殻 $hosts_yml_string = ''; try{     //動いている(running)、タグが該当のインスタンスを取得     $ec2client = Ec2Client::factory($auth);     $result = $ec2client->describeInstances([             'Filters' => [                     [                             'Name' => 'tag:AutoScaleGroup',                             'Values' => [$AutoScaleGroup_value],                     ],                     [                             'Name' => 'instance-state-name',                             'Values' => ['running'],                     ],             ],             'MaxResults' => 100,     ]);     //値の分解と使用     $reservations = $result['Reservations'];     foreach ($reservations as $reservation) {         $instances = $reservation['Instances'];         foreach ($instances as $instance) {             //もととなる文字のコピー             $mod_hosts_yml_string = $source_hosts_yml_string;             //置き換えに使う文字             $InstanceId = $instance['InstanceId'];             $publicip   = '';             foreach ($instance['NetworkInterfaces'] as $networkinterface) {                 $publicip = $networkinterface['Association']['PublicIp'];             }             //[INSTANCE_ID]と[PUBLIC_IP_ADDRESS]を置き換え             $mod_hosts_yml_string = str_replace('[INSTANCE_ID]', $InstanceId, $mod_hosts_yml_string);             $mod_hosts_yml_string = str_replace('[PUBLIC_IP_ADDRESS]', $publicip, $mod_hosts_yml_string);             $hosts_yml_string .= $mod_hosts_yml_string;         }     }     //書き込み     file_put_contents($hosts_yml_filename, $hosts_yml_string); } catch(AwsException $e){     var_dump($e->getMessage());     echo 'ERROR' . PHP_EOL . PHP_EOL; } echo 'generate_autoscale_yml END' . PHP_EOL . PHP_EOL;
  • テクログ

    AWS Control Tower とな!?

    マスオです。最近はAWSサービスの更新頻度についていけなくなりつつあります・・・。昨年の re:Invent 2018 にて以下のサービス(プレビュー)が発表されました。AWS Control TowerAWSを使っているとアカウントどんどん増えていって管理しきれない!みたいな状況に陥りがちだと思いますが、このサービスはそういった場合にセキュアなままで自動化や一元管理が可能となるとても便利なサービスのようです!当社もアカウントが増え続けており、管理している部署の負荷も高くなってきていますので、より少ない人的リソースで管理ができるようにするため役立ちそうです。まだ東京リージョン非対応でプレビューリリースとなっているので、まずは申込みをするところからになります。皆さんも良かったら是非お試し下さい!それではまた!
  • テクログ

    Dockerって何がいいの?

    どうも、久しぶりの投稿です。今回は初のテクログ。大した話はできないんですけども。。。ちょーど今扱ってるDockerについて良さを語りたいと思います。まず何がいいかって言うと、◆環境が一目でわかるこれに尽きると思います。今まで「サーバーに何入ってんの?」「これホントに一緒なの?」「一緒って言うたのにちゃうやん!!」っていう経験が皆さんもあったのではないでしょうか?ローカル環境と本番環境が全く同じっていう安心感ってたまんないですよね。AWSのFargateの話をすれば、、、EC2とは違い、プロビジョニングが不要ってところがアツいです。「大量アクセスきたぁー!サーバー台数増やします!」とかいらないんですよ。ある程度はスペック考えますけど、急な負荷でも自動でオートスケールをしてくれるっていう。。。いいっすね。ただ、いいことだけじゃないんです。。。デメリットもあげると、・DBキャッシュが持てない(潰して、立てる仕様だから全部リセットされちゃう)・ログも別のところに置かないといけない・IPを固定で持つことができない(これで困ることは今のところないですけど)・SSHログインできない(これつらい)SSHログインして直接ソース見たいときとかあるけど、それができない。だからログの出力が命になってきます。この環境にしてからログに残すことの大切さに今更気づきました。まぁ、でもこんなデメリットがあってもメリットの方がデカいからFargate環境を選んだんですけどね。しかも、長期休みとかでサーバーを止めておけば、その間は何と0円。EC2はサーバーを止めててもお金は発生します。でもFargateは0円。コスパいいね。みなさんも興味があれば是非触ってみて下さい。
  • テクログ

    AuroraのシングルAZからマルチAZに変更しよう!

    こんにちは!ほりけんです!今回は「Amazon Aurora」のシングルAZ→マルチAZについてご紹介したいと思います!ちなみにシングルAZとマルチAZについてはこちら↓(分かりやすかったので拝借させて頂きました)参照元:https://www.simpline.co.jp/tech_ty/multi-az%E9%85%8D%E7%BD%AE%E3%81%A8single-az%E9%85%8D%E7%BD%AE%E3%81%A8%E3%81%AF%EF%BC%9F/▪️Single-AZ>1つのアベイラビリティゾーンに配置される、手動で復元する必要がある。手動復旧が必要なのでちょっと時間がかかっちゃいますね…(5分くらいって言われてます)▪️Multi-AZについて>複数のアベイラビリティゾーンに配置される、自動でフェイルオーバーが行われる。だいたい1,2分で完了し、サービスが止まる時間はこのフェイルオーバーが行われている間だけなのでとても短い時間で済みます!(いいですね!どっちがいいの…?と言うのについては単純に「料金が高い」に付きます…(お財布と相談ですね…といった感じで、では本題のSingle-AZ→Multi-AZなんですが、AWSのコンソールからだと変更する箇所が…「なんとありません!」えー!どうやんの…といったところでAWSさんに問い合わせしてみました-------------------------------------Amazon Aurora におけるマルチ AZ 配置は、RDS for MySQL 等の マルチ AZ 配置とは異なり、クラスター配下の DB インスタンスが複数のアベイラビリティーゾーン( AZ )に配置されている状態を指します。その為、シングル AZ となっている Aurora クラスターに対して、新たにリードレプリカ(reader)を異なる AZ に追加していただくことで、当該のクラスターをマルチ AZ 構成へと変更することが可能です。現在、同じ AZ にプライマリインスタンスとリードレプリカが配置されていた場合、上述の通り、プライマリインスタンスとは異なる AZ に、新規にリードレプリカを追加していただく事でマルチ AZ の構成となります。-------------------------------------とのことです!なので違うAZにリードレプリカを作成するだけでSingle-AZ→Multi-AZになるんですね、なるほど…_φ(・_・勉強になりました!AWSは色んな機能があるから便利に使いたいですね(´∀`*)ではでは〜
  • テクログ

    AWS Auroraには再起動しても何しても消えないキャッシュが存在します

    AWSのAurora、使ってますか?SQLのクエリチューニング、してますか??弊社も常々WEBサイトのページ表示速度とは戦い続けていて、日々クエリチューニングをしています。そんなある日、スロークエリログにて重たいクエリを発見したので早速EXPLAINなどを使って確認しようとしたところ、1回目は激重だったのに2回目からは爆速で返ってきて「???」となりました。キャッシュだろうと思い「RESET QUERY CACHE」を打ってその後何回も実行してみましたが、結果は常に爆速。一体1回目の実施は何だったの?まさか…と思い確認したところ、Auroraではバッファプールキャッシュやページキャッシュといったキャッシュが使われこれらのキャッシュはDB再起動しても消えないしすべてのキャッシュを削除しても消えないとのことでした。つまり、初回時の速度を再現したいのであればDBインスタンスを新しく作成して実効するしかな、とのことです。詳しくはこちらの「存続できるキャッシュのウォームアップ」あたりをご覧ください。https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.StorageReliability.html
  • テクログ

    データベースに関するTips

    どうも、もう少しで50歳(半世紀)になる大西です。開発に携わっていると同じ結果を導くにあたり多くの手法が存在する事に気付くだろう。1つしか手法を知らず後になって損をしていた事に気付く・・・そのような経験も多いのではないだろうか。データベースについては30年以上前から今だに「そのような手法があるのか」と感心する事が多々ある。今回はデータベースの中でも MySQL に関しての「その方法でも出来るね」について記そう。■ TIMESTAMP および DATETIME の自動初期化および更新機能さて、まずはこれだ。最近でもカラムとして登録日時と最終更新日時を持たせている設計を多く見かける。きちんとシステム上必要なのであれば良いのだが「とりあえず入れとけ」は止めて頂きたいと常に思っているカラム達だ。このカラムが存在するにも関わらず無視しているプログラムは論外として、INSERT 時に「登録日時」と「最終更新日時」を、UPDATE 時に「最終更新日時」を、それぞれ NOW() を使用して値をセットするプログラムを多く見かけるのだが、経験上データベース側の日時値ではなくプログラム側の日時値でお願いしたい(プログラム側で日時データを作りその値をデータベースに適用するようにして欲しいのだ)。特に MySQL の日時については Ver8.0 になっても 2038年問題は残ったままのようだしプログラム側の日時値でお願いしたいものだ。何はともかくこれら私の希望を一旦棚の上に置くとして、登録日時と最終更新日時カラムが単にそのレコードの登録/更新の日時を表すだけならば NOW() を使うのは避けるべきだと述べておく。ではどうするのか。それは INSERT の時は登録日時と最終更新日時を、UPDATE の時は最終更新日時だけを自動でセットするようにすれば良い。テーブルを見てみよう。Create Table: CREATE TABLE `TBL_TEST` (     `key` varchar(32) NOT NULL,     `value` text NOT NULL,     `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,     PRIMARY KEY (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 update_at カラムはデフォルト値として CURRENT_TIMESTAMP を、そして ON UPDATE CURRENT_TIMESTAMP で更新時はその時の日時をセットするカラムにしている。create_at カラムは update_at と同様だが更新時には反応しないカラムにしている。INSERT してみる。mysql> INSERT INTO `TBL_TEST` (`key`,`value`) VALUES ('test','hoge'); mysql> select * from `TBL_TEST`; +------+-------+---------------------+---------------------+ | key  | value | update_at           | create_at           | +------+-------+---------------------+---------------------+ | test | hoge  | 2018-01-13 02:01:04 | 2018-01-13 02:01:04 | +------+-------+---------------------+---------------------+ update_at、create_at 共に自動セットされている。UPDATE してみる。mysql> UPDATE `TBL_TEST` SET value='fuga' WHERE `key`='test'; mysql> SELECT * FROM TBL_TEST; +------+-------+---------------------+---------------------+ | key  | value | update_at           | create_at           | +------+-------+---------------------+---------------------+ | test | fuga  | 2018-01-13 02:01:38 | 2018-01-13 02:01:04 | +------+-------+---------------------+---------------------+ update_at のみ自動セットされている。最近はデータベース等のレコード結果を KVS などにキャッシュし高速化を図る手法も多く見かける。その場合も NOW() は避けよう(繰り返すが本心はプログラム側で生成した日時値をセットして欲しい)。何にせよ SQL もスッキリするしこちらの方がエレガントなので是非とも検討/実践して欲しい。■ SQL_CALC_FOUND_ROWS次はちょっとした Tips のようなものだ。検索結果などを表示する場合にはページングというテクニックを使用する場合があると思う。その場合ページングのため(結局何ページ分必要なのかを先に知る必要があるため)総レコード数を知る必要がある。この際に同じ WHERE句 で SELECT と COUNT(*) を発行して1ページ分のレコードと総レコード数を取得するプログラムを多く見かける。このような場合は SQL_CALC_FOUND_ROWS と FOUND_ROWS() を使うと良いだろう。mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE `hoge`>100 LIMIT 10; mysql> SELECT FOUND_ROWS(); 最初の SELECT で条件に合致するデータセット(1ページ分)が取得出来て、次の SELECT で条件に合致する(OFFSET / LIMIT 無関係の)レコード総数が取得可能だ。SELECT を2回発行する事に変わりはないのだが、こちらの方がエレガントであろう。今回は案件でも多用しているであろう MySQL についてその Tips 的な事柄を書いてみた。この他にも MySQL には寿司ビール問題やハハパパ/アルファベットの大文字小文字問題といったキャラセット/コレーションに関する問題もある(これらの問題について知らないというエンジニアは今すぐ調べて欲しい)。MySQL もこれら問題に対応すべくデフォルトの設定を見直すなど出来るところから対応してくれている。プログラムやシステム、ミドルウェアのデフォルト設定などが「そうなっている」のには必ず理由があるものだ。その理由を知るだけでもスキルアップに繋がると思う。手元を見返し「そうなっている」理由を是非とも考えて欲しい。それではまた。