WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!の対処

自社業務でステージング環境にssh接続するときに以下のエラーが発生

エラー

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

これは同一ホストを持つ仮想環境が再起動されたことで、
かぎ情報が更新されてしまい自身が持つ公開鍵情報と合致せずにログインできなくなってしまうとのこと。
割とDockerを使っていると良く起きる。

原因

鍵情報がknown_hostsに登録されているので、こちらを一度削除してあげる必要があり
新しいホストの鍵情報を登録してあげる必要がある。

対応方法

以下のコマンドを実施することで、対象のホスト名を持つ鍵情報を削除できる

ssh-keygen -f "/<directory>/.ssh/known_hosts/" -R "xxxxxxx.ap-northeast-1.elb.amazonaws.com"

これでエラーが解消。

SBT(ビルドツール)

業務の説明でSBTについて説明して頂いた。

どうでもいいがgoogleの検索トップはソフトバンク・テクノロジー(違う)

 

自身の理解を深めるために調査した内容を書いていきます。

SBTとは

sbt

SBTはビルドツールの一種

JavaのAntビルドやMavenビルドに相当するもの

対応言語はScalaJava(基本的にScalaで使われることが多い?)

最近ではGradleというビルドツールもありますが、

Scalaのみのプロジェクトであればsbtがデファクトスタンダード

言って問題ないようです。

 

スポンサーであるLightbendでは商用サポート・サービスを行っており

「自信をもってミッションクリティカルなシステムに採用することができる。」

とのこと

Cloud Native Application Platforms | @lightbend

 

サポートを受ける方法はStackOverFlowで【sbt】というタグを設定することで受けることができる。

 

 

特徴

こちらの引用となります。

https://www.scala-sbt.org/1.x/docs/index.html

  • 単純なプロジェクトでは設定がほとんどいらない。
  • Scalaコードの柔軟性をフルに活用できるScalaベースのビルド定義を使う
  • コンパイラから抽出した情報を利用した正確なインクリメンタル再コンパイル
  • トリガー実行による継続的なコンパイルとテスト
  • jarをパッケージ化して公開する
  • scaladoc でドキュメントを生成
  • Scala/Javaの混合プロジェクトをサポート
  • ScalaCheck、specs、ScalaTestでのテストをサポートしています。JUnitプラグインでサポートされています。
  • プロジェクトクラスとクラスパス上の依存関係でScala REPLを起動します。
  • サブプロジェクトでモジュール化をサポート
  • 外部プロジェクトのサポート
  • タスクの並列実行 (テストの並列実行を含む)
  • ライブラリ管理のサポート: インライン宣言、外部IvyまたはMaven設定ファイル、または手動管理

 

仕様

  • 定義ファイル

「build.sbt」に定義されているが、「*.sbt」なら何でもいいらしい。

「build.sbt」が配置されているディレクトリがベースディレクトリになる。

「/tmp/foo/build.sbt」ならば、「/tmp/foo」がベースディレクト

Mavenと同じディレクトリ構成

  • ビルドサポートファイル

以下のようにproject配下にヘルパーオブジェクトなど定義が可能とのこと

プロジェクトが肥大化した場合に有効とのこと(詳細はサイト参照)

build.sbt
project/
  Dependencies.scala

 

SBTの使い方

下記サイトに利用方法がまとめられている。

www.scala-sbt.org

上記は日本語ページだが英語、中国語、スペイン語もある。

訳は自動翻訳ではなく有志がやっている模様。githubにissue管理されている。

 

公式ページ

www.scala-sbt.org


 

 

参考サイト

https://www.scala-sbt.org/1.x/docs/ja/Getting-Started.html

https://ja.wikipedia.org/wiki/Sbt

https://qiita.com/keiSunagawa/items/d9dfad172713c31ddbc1

https://gist.github.com/hnaohiro/5c19c0c404e0848147300183f929b2b0

https://www.it-swarm.dev/ja/scala/sbt%E3%81%A8gradle%E3%81%AE%E6%AF%94%E8%BC%83/1066694586/

AtCoder169振り返り(A〜C)

AtCoderの復習

結果

約40分の3完で終わり
4問目だけちょっとみて諦めました。(時間があれば復習しておきたい。)
2問目はオーバーフローの考慮が難しくつまづきました。
また自分が未だにJava7でコーディングしていることに気づいてしまい唖然。
次回からはJava8を使います。。。

成績

初めての茶色コーダ!
AtCoderの存在を知り参加し始めて約4ヶ月、ようやくです。
正直思ったよりも時間がかかってしまいました。
f:id:lawrence-twin:20200601121833p:plain

Ratingは以下の通り
文字の色が変わるんですね。(分かりづらいですが。。。)

f:id:lawrence-twin:20200601122052p:plain

なお今の実力では茶色上位まではいけますが緑コーダは難しそうです。
基礎的なアルゴリズムを学んでいく必要があるのでこれから色々勉強します。

問題

問1

atcoder.jp

問題が簡単すぎてビビりました。
int型でもオーバフローは起こり得ないので簡単に求められます。

■回答コード

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			int a = scn.nextInt();
			int b = scn.nextInt();
			System.out.println(a * b);
 
		}
	}
}

問2Multiplication 2

渡された引数を順に計算していって、最終的に10^18を超えるかかをチェックする問題です。
この問題ではオーバーフローをどのようにして考慮するか?というのが問題となります。
解説にある通りPythonならば128bitで計算が可能なのでそのまま実装できます。
一方でJavaの場合Java8以降であれば「Math.multiplyExact()」でオーバフローを検出できます。
が、なぜかいまだにローカル環境がJava7でやっていたので利用できませんでした。(というかlong型対応しているのでしょうか?)

私の場合かなり乱暴ですが、オーバフローをした場合
数値が10^18より大きいことに加えて、元の値より小さくなっていた場合を判断に組み込むことで実現しました。
(負数である場合、とした方がスマートでしたでしょうか。)

■回答コード

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			int N = scn.nextInt();
			long[] a = new long[N];
 
			for(int i = 0; i < N; i++) {
				a[i] = scn.nextLong();
				if(a[i] == 0) {
					System.out.println(0);
					System.exit(0);
				}
			}
 
			long max = (long) Math.pow(10, 18);
			max++;
 
			long tmp = a[0];
			for(int i = 1; i < N; i++){
				if(tmp * a[i] / max >= 1 || tmp * a[i] < tmp) {
					System.out.println(-1);
					System.exit(0);
				}
				tmp *= a[i];
			}
			System.out.println(tmp);
		}
	}
}

問3Multiplication 3

A×Bの小数点以下を切り捨てて、結果を整数として出力する。というシンプルな問題です。
直感的に浮動小数点で計算するとダメな気がしたので
BigDecimal型を利用しましたが問題なかったです。

解説では「(A × (B × 100))/100」でも誤差をなくすことができると記載があるので
こちらの方が綺麗なコードが掛けると思います。


■回答コード

import java.math.BigDecimal;
import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			long A = scn.nextLong();
			BigDecimal B = scn.nextBigDecimal();
 
			System.out.println(BigDecimal.valueOf(A).multiply(B).setScale(0, BigDecimal.ROUND_DOWN));
 
		}
	}
}

解説

https://img.atcoder.jp/abc169/editorial.pdf

Auroraとは

PayPayのProduct Blogを拝見していると、以下の文言が

 

上記のブログが書かれた時期以降、実はマネージドデータベースをRDSからAuroraに移行しました。ただ、残りのものはほぼ当時と変わっていません。

 

Amazon Aurora」というものが良く知らないので調べてみました。

 

Auroraとは

RDS(Relational Database Service)の一種

Amazonが提供しているサービスの一つで従来のRDSサービス(MysqlPostgreSQL)と互換性を持っている。

Wikipediaを参照すると

・2014年10月:Amazonサービスとして提供(MySQLと互換あり)

・2017年10月:PostgreSQLとの互換性が追加

・2018年10月:サーバレスバージョンが提供される。

・2019年:Aurora開発者がクラウド環境向けに根本的に再設計したことでSIGMOD ※  Systems Awardを受賞

※SIGMODは技術的な貢献が大規模データ管理システムの理論や実践に大きな影響を与えたものに与えられる賞、2017年はSQL Lite、2015年はPostgresなどが受賞している

 

Auroraの特長

互換性

サービス開始当初よりMySQLとの互換性を持つように設計された。

MySQLコマンドラインクライアントやMySQL Workbenchグラフィカルユーザインターフェイスが使用できる。

だがすべてのMySQLオプションと機能を利用できるわけではないとのこと。ストレージエンジンとしてはInnoDB ※をサポートしている。

MySQLのデフォルトストレージエンジン

 

パフォーマンス

標準的なMySQLと比較して最大5倍、

PostgreSQLと比較して最大3倍のパフォーマンスを持つ。

 

スケーラビリティ

ストレージシステムは分散型

Amazonストレージはデータベースインスタンスごとに最大64TBまで自動スケール可能

他読み取りのキャパシティ、ぱふぉーまんすをすけーるするために3つのアベイラビリティゾーン間で低レイテンシーのリードレプリカを最大15個追加可能

 

高可用性

ユーザのデータを6個レプリケーションし、継続的にAmazon S3をバックアップすることでBTTFを99.99%超えるように設計されている。

 

 

導入事例

MySQL互換としてかなり有名な企業で導入されているようです。

日本で有名なところだとNetflix、TrendMicro、GunghoやPayPayなどが提供されています。

Netflixトレンドマイクロ

ガンホーPayPay-ペイペイ(キャッシュレスでスマートにお支払い) - Apps on ...

 

料金

データベースインスタンスMySQL版とPosgreSQL版の2種類が用意されており、

リージョンや契約するインスタンスによって料金は細かく変動します。

細かい情報はこちらにのっていますが、

https://aws.amazon.com/jp/rds/aurora/pricing/

一旦東京リージョンかつMySQL版は以下の通りとなります。

 

スタンダードインスタンス – 現行世代 時間あたりの料金
db.t3.small 0.063USD
db.t3.medium 0.125USD

 

メモリ最適化インスタンス – 現行世代 時間あたりの料金
db.r5.large 0.35USD
db.r5.xlarge 0.70USD
db.r5.2xlarge 1.40USD
db.r5.4xlarge 2.80USD
db.r5.8xlarge 5.60USD
db.r5.12xlarge 8.40USD
db.r5.16xlarge 11.20USD
db.r5.24xlarge 16.80USD

 

なおServerlessの場合はインスタンスがないのでACUで計算されます。

東京リージョンの場合は以下の通りの金額となります。

   
Aurora キャパシティーユニット 0.10USD/ACU 時間

 

 

 

 

引用記事

blog.paypay.ne.jp

 

 

参考サイト

https://www.ossnews.jp/oss_info/Amazon_Aurora

https://aws.amazon.com/jp/rds/aurora/

https://aws.amazon.com/jp/relational-database/

https://www.aurorafoss.org/about/

https://en.wikipedia.org/wiki/Amazon_Aurora

https://aws.amazon.com/jp/rds/aurora/pricing/

Anti division

AtCoderの勉強をしようと思っていたら、
数学的問題を解けた方が良いとのことで以下の問題が進められていたのでやってみました。

atcoder.jp


問題文は単純で以下の通りです。

A ≦ Bの範囲の値で、
CまたはDで割り切れない数がいくつあるかを求める問題です。

一瞬 A ≦ Bの範囲をループ処理することを考慮しましたが、
10^18まで発生する可能性があるので、TLEになると思い別の方法を検討することが大事です。

まず、以下の通り分けて考えました。
①B - Aが、割り切れない可能性がある最大の数
②B - A の数を C で割った数 を求める
③B - A の数をDで割った数を求める

最後に、①に②、③を引けば求められる。。。と思ったのですがこれではまだ不十分です。
CとDの割った数が重複している場合、その値は割り切れる数として重複カウントしてしまいます。
この数値は重複せずにカウントする必要があるので、最小公倍数を求めたうえで以下を求める必要があります。
④ B - Aの数をlcm(c, d)で割った数を求める 

lcmとは

lcmとは Least Common Multipleの略で最小公倍数を指します。
最小公倍数はプログラムで表現すると以下の通りとなります。

アルゴリズム

	static long lcm (long a,long b) {
		long temp;
		long c = a;
		c *= b;  //暫定的にA, Bを掛けた値を設定する。
		while((temp = a%b)!=0) {  //A mod Bを求める。これを繰り返す(ユークリッドの互除法?)によって最終的に求められるっぽい
			a = b;
			b = temp;
		}
		return c/b;
	}


自分でコーディングすると以下の通りとなりました。
一応sampl1~3まではOKでしたが4以降は分からないですね。
■私的回答コード

import java.util.Scanner;

public class Main131_01 {
	public static void main(String[] args) {
		try (Scanner scn = new Scanner(System.in)) {
			long A = scn.nextLong();
			long B = scn.nextLong();
			long C = scn.nextLong();
			long D = scn.nextLong();

			long minmaxVal = B - A + 1;
			long cd = lcm(C, D);
			long div = B / cd - ((A - 1) / cd);
			long cDiv = (A - 1) / C - B / C;
			long dDiv = (A - 1) / D - B / D;

			System.out.println(minmaxVal + div + cDiv + dDiv);

		}
	}

	static long lcm (long a,long b) {
		long temp;
		long c = a;
		c *= b;
		while((temp = a%b)!=0) {
			a = b;
			b = temp;
		}
		return c/b;
	}
}

もうちょっときれいにできると思いますが、こんなところです。
lcmのようなメソッドは良く使うのでatcoderで提出用のソースコードにテンプレで含めておこうかな。。。

Dockerコマンドまとめ

docker

  • コンテナ技術、コンテナ内に必要なアプリケーションを内包したImageを作成し、異なる環境に対して容易に適用できる状態にする。
  • 単体のコンテナに対してのコマンド

基本的なコマンド

docker image build

Desc:DockerfileからDockerイメージをビルドする。
Sample:

docker image build -t example/echo:latest .

Note: "." はカレントディレクトリを指す。

docker search

Desc:Docker HubにホストされているDockerイメージを検索する
Sample:

docker search nginx

Note: リポジトリのスター数の降順で表示される。

docker image pull

Desc:DockerレジストリからDockerイメージを取得する
Sample:

docker image pull gihyodocker/echo:latest
docker image ls

Desc:対象のDockerホストが保持しているDockerイメージの一覧表示
Sample:

docker image ls --no-trunc

Note:--no-truncオプションをつけることでIDなどが省略されずフルで表示される

docker image push

Desc:DockerレジストリにDockerイメージを送信して登録する
Sample:

docker image push localhost:5000/ch04/todoapi:latest
docker image tag

Desc:Dockerイメージのタグを作成する
Sample:

docker image tag ch04/nginx:latest localhost:5000/ch04/nginx:latest
docker container run

Desc:新規にDockerコンテナを実行する
Sample:

docker container run -d --rm --name cronjob example/cronjob:latest

Note:「-d」はバックグラウンドで実行

docker container ls

Desc:dockerdが保持しているコンテナの一覧を表示する
Sample:

docker container ls --no-trunc

Note:「--no-trunc」をつけることでコンテナID一覧が表示できる

docker container stop

Desc:実行中のコンテナを停止する
Sample:

docker container stop $(docker container ls --filter "ancestor=example/echo" -q)

Note:stopの後コンテナIDではなくlsコマンドの結果を抽出・停止するようにすれば一々調べる必要がない。

docker container restart

Desc:停止したコンテナを再実行する
Sample:

docker container restart <containerId>
docker container rm

Desc:ディスクからコンテナを削除する
Sample:

docker container rm <containerId>
docker container logs

Desc:コンテナのログ(標準出力)を表示する
Sample:


docker container exec -it

Desc:実行中のコンテナの中でコマンドを実行する
Sample:

docker container exec -it <Name>.<ID> bash

Note:最後がbashならcontainerに入ってbashが実行できる。mysqlならmysql起動など

docker container cp

Desc:コンテナからホスト側へファイル・ディレクトリをコピーする
Sample:

docker container cp <containerId>:<containerDir> <hostDir>

※引数の順番を逆にするとホスト→コンテナへのコピーとなる。

docker container prune

Desc:停止した全てのコンテナをディスクから削除する。(試したことはない)
Sample:

docker container prune
docker image prune

Desc:未使用の全てのDockerイメージをディスクから削除する(試したことはない)
Sample:

docker image prune
docker system prune

Desc:利用されていない一切のDockerリソース全てを削除する(試したことはない)
Sample:

docker system prune
docker container stats

Desc:コンテナ単位でのシステムリソースの利用状況をリアルタイムで表示する
Sample:

docker container stats --no-trunc

Note:「--no-trunc」を指定すると出力が省略されない


docker-compose

  • 複数コンテナで構成されるサービスを起動・管理するための機能
  • Dockerfileに必要な定義を設定、読み込むことで実現している

基本的なコマンド

docker-compose build

Desc:Composeで管理するServiceをイメージからビルドする
Sample:

docker-compose build

Note:実行した直下のDockerfileを読み込み、Imageのみ作成する

docker-compose create

Desc:Composeで管理するServiceを作成する
Sample:

docker-compose create
docker-compose start

Desc:Composeで管理するServiceを開始する
Sample:

docker-compose start

Note:コンテナ起動のみ※Imageがないとダメ

docker-compose up

Desc:Composeで管理するServiceを作成・開始する
Sample:

docker-compose up -d

Note:Image作成と起動まで全てやってくれる。オプション「-d」でバックグラウンド実行

docker-compose stop

Desc:Composeで実行中のServiceを停止する
Sample:

docker-compose stop
docker-compose rm

Desc:Composeで実行中のServiceを停止する
Sample:

docker-compose rm -f

オプション「-f」で強制削除

docker-compose down

Desc:Composeで実行中のServiceを削除する
Sample:

docker-compose down

Note:「docker-compose down --rmi all --volumes」という滅びの呪文があるらしい

docker-compose ps

Desc:Composeで実行中のコンテナ一覧を表示する
Sample:

docker-compose ps
docker-compose logs

Desc:COmposeで実行中のコンテナのログを集約して表示する
Sample:

docker-compose logs

以上です。

Docker/K8S実践コンテナ開発入門@28日目

昨日勉強した件で、
アプリケーションを実行したにも関わらず、何もログに出力されなかった件について調べました。

lawrence-twin.hateblo.jp

fluentdを書籍に従って構築してみたのですが、
正常に起動しておらずエラーをバンバン出していました。

■エラー抜粋
2020-05-28 10:46:11 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2020-05-28 10:46:12 +0000 error_class="MultiJson::AdapterError" error="Did not recognize your adapter specification (cannot load such file -- bigdecimal)." plugin_id="out_es"

今回注目したのは「Did not recognize your adapter specification 」の方です。
こちらは同じような問題を抱えている方がいらっしゃいました。

github.com

■対応

書籍にあった「fluentd.yaml」を以下の通り修正しました。

修正前: image: fluent/fluentd-kubernetes-daemonset:elasticsearch
修正後: image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1

elasticsearchのバージョンを指定していなかったので、
適切なバージョンが選ばれなかった???のでしょうか。

ともかく、上記設定を変更することでエラーは解消しKibanaの方でも
kubernetes.labels.app: echo」と入力することで、echoログが表示できるようになりました。

f:id:lawrence-twin:20200528201005p:plain

その他のログ収集ツール

Google Stackdriver
  • GCPAWSのロギングやモニタリングを行えるモニタリングサービス
  • StackdriverLoggingはKibanaやElasticsearchのように構造化されてインデックスされたログが検索できる
  • GKEではマネージドサービスとして提供されているので管理する必要がない
stern
  • コマンドラインツール
  • ラベル指定だけで簡単にログが確認できる※コンテナ再起動でIDが切り替わってもそのままのコマンドが利用可


続きは明日以降