くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

その他もろもろ

AWS SQLServerのRDSの作成+バックアップとリストア

タイトル通りでハマった・迷ったところのみ記載。


作成

公式のドキュメントに載ってるままなのですが、照合順序の指定は最初からやっておかないとなので、作る時に下記が必要。

aws-sample01

日本語ベースで使うなら上記は必須かな。

あとセキュリティーグループで1433のポート開放しておかないと、SSMSで繋げなくなる。


復元

復元する場合、基本的にS3にバックアップファイル上げて、そこから復元する。

S3にアクセスするために、オプショングループの割り当てとか必要なのですが、その辺がいまいちわからなかった。

  • オプショングループ作成

aws-sample02

  • 追加したグループにオプションの追加

aws-sample03

  • で、ハマったのがここ

IAMロールを先に作らないとダメなのかと思って公式に記載のアレコレやってたのですが、そうじゃなくて、単純に「新しいロールの作成」選べば、よしなにやってくれる。

aws-sample04

  • インスタンスの変更からオプショングループを指定

aws-sample05

  • 復元

S3の所定のバケット内にバックアップファイルをアップロードして、SSMSで作ったインスタンスに接続して下記クエリを実行。

exec msdb.dbo.rds_restore_database 
@restore_db_name='復元後のDB名', 
@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name';


バックアップ

バックアップは上記復元の設定が出来てればあとはSQLで下記を実行。

exec msdb.dbo.rds_backup_database
@source_db_name='バックアップ対象のDB名', 
@s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name';


バックアップ・復元タスクの状況確認

実行したクエリの状況が見たい場合は下記

exec msdb.dbo.rds_task_status

この辺のSQLは公式のこの辺に記載されてるやつを見た方が良い。


あとバックアップの運用について。

スナップショットを自動で取ってはくれるのですが、スナップショットの復元って、必ず別インスタンスに復元されるじゃないですか?

中身のバックアップとってアタッチしたいだけなんだけどなー。

別インスタンスに復元されたところで、アプリのもろもろの設定変えないと意味ないしの。

まーそこから復旧出来るので十分ではあるのかもですが。

DB毎のDaily/Weeklyバックアップ的なのはSQLServerならSQLエージェント側で上記のバックアップSQLとか組んで実行しておくしかないかな?

他にやり方あるのかしら?

AWS instance-connect利用でブラウザでサーバコンソール触れるようにする

タイトル通り。

2年前くらいはこれなかったと思うのですが、いつから出来るようになったんだろ。

Azureはブラウザからサーバコンソールをちょろっと触れたり出来たので、AWSも出来ないかなーと思ってたところ、今見たら出来そうだったのでお試し。ちょっとはまった。

公式のドキュメント

流れ。

  1. セキュリティポリシーの変更
  2. EC2 Instance Connectをサーバ側にインストール
  3. EC2 Instance Connect の IAM アクセス許可を設定する


セキュリティポリシーの変更

今回はまったのがここ。動かない時は下記のエラーメッセージ出る。

We were unable to connect to your instance. Make sure that your instance’s network settings are configured correctly for EC2 Instance Connect.

普通に制限してるアクセス先のみのIP設定だけでよいと勘違いしてた。どうもそうじゃないらしい。AWSが公開してるリージョンのIPを解放しないとダメな模様。何かを経由してアクセスしてるのかしら?

AWSが公開してるIPの範囲

東京リージョンなら、3.112.23.0/29。(2021/2/2時点)

こんな感じで追加。

sample

EC2 Instance Connectをサーバ側にインストール

最近はデフォで入ってるらしい。入ってない場合は公式のドキュメントに書かれてる感じでインストール。

IAM アクセス許可を設定する

AWS CLI入ってる端末ならどこでも。

公式通りですが、こんな感じで設定。

例えばmy-policy.jsonで↓のような内容でファイル作る。

{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "ec2-instance-connect:SendSSHPublicKey",
        "Resource": [
            "arn:aws:ec2:region:account-id:instance/i-1234567890abcdef0"
        ],
        "Condition": {
            "StringEquals": {
                "ec2:osuser": "ami-username"
            }
        }
      },
      {
        "Effect": "Allow",
        "Action": "ec2:DescribeInstances",
        "Resource": "*"
      }
    ]
}

regionは東京リージョンなら、「ap-northeast-1」

account-idは対象IAMユーザのアカウントID。712345678901みたいなやつ。

/i-1234567890abcdef0のところは対象のEC2のインスタンスID。

ami-usernameはインスタンスへのログインユーザ名。デフォならec2-user

ファイル作ったら下記コマンド

aws iam create-policy --policy-name my-hogehoge-policy --policy-document file://my-policy.json

policy-nameは適切につけた方がよさげ。

aws iam attach-user-policy --policy-arn arn:aws:iam::account-id:policy/my-hogehoge-policy --user-name IAMユーザのAWSへのログインユーザ名

my-hogehoge-policyは一つ前のコマンドで指定したポリシー名。


これでブラウザからコンソールいじれるという寸法です。


2021/2/11追記

このブラウザ上のコンソール、タイムアウトが結構早い。10分くらい。

これ伸ばせないのかしら?設定的なものが見つからない。。。

電話とか来ると再接続メンドウ。

RHELの一部無償化のライセンス拡張?

以前、CentOS8終了のお知らせを書きましたが、RedHatが”部分的に”RHEL無償提供始めるっぽい?

さすがにボロクソに言われ過ぎたか。親のIBMを目の敵にする人も結構いましたし。。。

RedHat公式

もともとの開発用のRHELを拡張して、小規模本番利用も16システム(サーバ?)までは無償でいいよって事なのかな?

でも、小規模本番の方は

Individual Developer subscription for RHEL can be used in production for up to 16 systems.

でindividualっていうのが微妙かしら。

個人で何かサービス提供してる人はって事なのかな?

うーん。ライセンス出たらちゃんと読まないと何とも言えない。

開発用にAWSとかで建てるサーバはお金かからなくなるってことなのかしら?

We know that these programs don’t address every CentOS Linux use case, so we aren’t done delivering more ways to get RHEL easily. We’re working on a variety of additional programs for other use cases, and plan to provide another update in mid-February.

CentOSの代替になってないのは分かってるから、もっとライセンスの拡張考えてるそうで、2月中旬くらいに何か出すらしい。

どうなるかしら?

CentOS8は2021年末で終了予定らしい

2021年末でCentOS8は終了するらしい。

CentOSはStremに集中します[CentOS.org]

今までありがとうございました。

でも、どうしようかしら...

Streamは立ち位置が違うしの。社内で使う分にはいいかもだけど。

困る人はRedHatに相談しろ、って言ってるけど、

相談したら見積もりくるよね。RedHatに移れって事よね。

さて。。。


商用利用前提で考えると、やっぱりもうRHEL1択でしょうか?

社内サーバ用ならStreamでも十分すぎかな?

ちょっと様子見が必要そう。

ここのブログの解説が一番わかりやすいと思うのですが、

マイナーリリース想定だから、Streamもあり?

でも、結局、"RHELの開発ブランチのSnapshot"っていうのがアレなんですよね。

何かいいの無いかなー。

まー、おとなしくRHEL使えって事なんでしょうけども。。。

AWS CentOS Streamのイメージ


やっぱりstreamは無いかなー。お客さんに説明つかないし。

RHELの方がその辺は楽だけどやっぱりお値段がね...

いったん営業さんに聞いてみるしかないか。

フリーでいくなら、代替としてはubuntuかoracle linuxあたりになるのかしら?

昔はScientific Linuxっていうのもあったけど、調べてみたらこっちも終わってるのね。

oracle linuxはなー。oracleさんいつ手のひら返すか分かんないから手出すの怖いよね。RHELのリリースブランチのベースのcentos無くなって、何か変えて来たりするのかしら。

というかCentOS8自体最初は10年サポート保証してたように思うのでこっちも手のひら返したのか。。。

となるとubuntuしかない?DebianとかFreeBSDでも?

世界的にはubuntuの本番利用数はダントツでしたしね。

ただ、どういうところが何に使ってるのかにもよるけども。。。

デスクトップの延長線でそのままサーバにしてるところが多かったりしたら微妙な気も。

CentOS使ってる人間からすると、ubuntuはどうしても体系が違うから、それまでの技術資産が通用しなくなるのが痛いよね。

k8s系のところとかどうなんでしょ。。。

うーん。結局お金ないからCentOS使ってるんだろうし。

もういっそWindowsもありかしら?それこそ技術資産通用しないか。

やっぱRHELかなー。

まー技術には金払えって事だ。ド正論過ぎて何も言えない。


CentOSのフォーラム見てたら、RockyLinuxとCloudLinuxっていうのがあるみたいですね。

https://forums.centos.org/viewtopic.php?f=54&t=76600

https://forums.centos.org/viewtopic.php?f=10&t=76601

まだリリースされてないのかな?ただ、すぐには選択肢には入らなそう。

フォーラムでもやっぱりoracle linuxは選択肢に上がってるけど、

声を出す人の中ではoracleさんは信用できない感じみたい。特に反論も見ないの。

将来も大丈夫だろうと期待を込めれる人はoracle linuxの方が良さげ?

LinuxのシェルでUNIXTIME確認

メモ。

# 今のUNIXTIME
date +%s

# UNIXTIMEを西暦日時表示
date -d @1607001913 +"%Y/%m/%d %T"

# UNIXTIMEの一日
86400

Docker imageの名前の部分一致指定で複数一括削除

docker imagesで出てくるimageをrepositryの名前部分一致指定で一括で削除したい場合。

docker rmi -f `docker images "hogename*" -q`

composeとかで、プレフィクス的に名前揃えたテスト用のコンテナ丸ごと消したりするのにたまに使う。けどすぐ忘れる。

AWS EC2でドメイン取得してHTTPSのサーバ作る流れ

何となく、とりあえずやりたい場合の全体的な手順ってあまり見ないので、

とりあえずやるって場合で肝のところ。


構成

だいたいこんな感じ。

sample01

流れ

  • ドメイン取得とDNS(Route 53)
  • インスタンス(EC2)
  • LB作る(証明書も)
  • DNS側にLBのAレコードを作る
  • セキュリティーグループとかの設定

ドメイン取得とDNS(Route 53)

Route53のサービスからドメイン登録選んで色々入力。

個人の管理者なら画像くらいの情報で。ここはちゃんとした情報を入力しないとダメ。

ドメイン名は結構取られてる事が多いと思うので頑張ってひねり出す。

個人的な利用なら.netでいいかなと思いました。

sample00

sample00-1

sample00-2

昔は個別にDNSやらなきゃいけなかったみたいですが、今はここで登録すれば

DNS側も勝手に登録してくれる。↓のところで確認。

sample05

インスタンス直にEIPとか関連付けてそっちにドメインつけたい場合は、ここのDNSに該当インスタンスへのAレコードを登録してあげる。(今回はLB側に付けるのでここまででOK)

インスタンス(EC2)

いったんインスタンス作る。インスタンスは適当に。Webサーバなら何でもいい。

LB作る(証明書も)

sample06

sample07

sample08

※ HTTPSを選んでおかないと、次のステップでその辺の設定が出てこない。

sample09

ACMを選択して、ACMで新しく証明書作るのリンクから証明書作りに行く。

sample10

sample11

sample12

検証中の状態になったら、上記の詳細を開いて、ここからRoute53へCNAMEレコードを追加する。手でやってもいいかもだけど、何か上手くいかなかったのでここからやった方が無難。

登録されたかどうかは、Route53で該当のホストゾーンの中のレコードを見る。CNAMEが追加されてるはず。↓

sample13

証明書の検証自体は、数分~10数分くらいで終わるはず。終わったら下記の発行済み状態になる。

sample14

↑まで終わったら、元のLBの登録の画面に戻って、「証明書の名前」のところに今のモノを入れる。

あとは適当にLBの設定をして作る。

DNS側にLBのAレコードを作る

LB作り終わったら、DNSにLBの情報を入れてあげる。

sample20

sample21

sample22

↑。対象のLBを選択。

セキュリティーグループとかの設定

あと、セキュリティというかACLの設定。

Webサーバ側にLBのセキュリティグループを追加してあげないとダメ。

CentOS7 Docker初期セット

完全にメモ。

sudo yum update -y
sudo yum upgrade -y

# docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce docker-ce-cli containerd.io

sudo usermod -aG docker $USER
sudo gpasswd -a $USER docker

sudo systemctl start docker
sudo systemctl enable docker

# docker-compose
sudo yum install -y wget
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# あと要らない解凍ファイルとか消す。
# 再起動

https://docs.docker.com/compose/install/

CypressとJestのカバレッジをマージする

以前、Nuxtの単体テストをCypress使ってやる奴を書きましたが、実際にやってみてこれはこれでつらかった。

やっぱりメソッドとか簡単な部分はJestというかVue-test-util使ってちょこちょこっと書けた方が良い。

でもやっぱりあれこれやり始めるとVue-test-utilだとつらい・・・。

じゃー、使い分ければいいじゃんと。

で、そういう時に問題になるのが、カバレッジのマージ。

nycはいちをそれも出来るんだけど、マージの仕方が何か微妙な気がするのですが・・・。

どっちかにあるものの、MAXで見るか、平均で見るかって感じ?

単純に通ったコードのカウント部分マージしてくれればいいんだけどなー。

何でこういう感じになってるんだろ?何かやり方が間違ってるのかしら?

公式にも載ってるサンプルのリポジトリと同じやり方してみても、上手くいかない。

というか、ぶっちゃけ現状バグってますよね?istanble-lib-coverageがおかしいのかしら?色々やってみると大体結局↓のエラーが出る。

TypeError: Cannot read property 'start' of undefined

多分これ、coverage.jsonのファイルって下の感じの定義じゃないですか。

statementMap:{
 "0":{
     start:1,end:1
  },
 "1":{
     start:2,end:2
  }
},
s:{"0":3, "1", 4}

で、sのオブジェクトがstatementMapの定義してる行数を通った回数になってると思うのですが、

マージすると、statementMap側に存在しないキーがs側に出来る場合があるっぽ。

ダメじゃん。

同一ソースなら一緒になるはずなのですが、

jestとcypressで微妙に定義の仕方が違うん場合があるんですよね。行数は一緒なんですけど。


なので、cypressとjestの組み合わせ限定ですが、coverage.jsonをマージするスクリプトを作った。

別に大した事はやってないのですが、だいぶ面倒くさいところなので、何かに使えれば参考にどうぞ。

下記にあげました。

https://github.com/n79s/cy-jest-coverage-merge

10億人が笑うSVGからナゼか正規表現の話

Billion laughs攻撃っていうのがある。

XMLで参照を多重に定義して、メモリを食いつぶさせてPCとかアプリを固まらさせるやつ。

で、これってSVGでも可能だったんですね。

下の画像をFireFoxで見るとFireFoxのタブが固まる。(Chromeは大丈夫だった)

https://github.com/cirosantilli/web/blob/master/svg-billion-laughs.svg

上の画像をDLして、例えばパワーポイントとかに画像挿入しようとするとパワポも固まる。


上の画像のソースを見ればわかりますが、この程度の参照の組み方だけで、

組み合わせ爆発でヤバイ事になるという訳なんですが、

参照をネストさせるようなものはやっぱり考え物って事ですね。

正規表現なんかも、例えば

(a|b|c)(e|d|f)

みたいに組み合わせで色々やるとエライこっちゃになるパターンがあったと思う。

↑だけじゃ再現させられなかったんですが、昔どこかのコードで見たんだよなー。

組み合わせ爆発って怖いですね。結構意識せずにやっちゃいそうな気もする。


正規表現でいうとMSDNの正規表現のベストプラクティスのページがすごく面白かった。

長さが 5 文字を超えると、文字列の文字が 1 文字増えるたびに処理時間が約 2 倍に増加します。 つまり、有効に近い文字列の長さが 28 文字になると処理に 1 時間以上かかり、33 文字になるとほぼ 1 日かかることになります。

確かに正規表現作ってる時って、正しい文字列ばっかり考慮してるきらいがありますよね。

「*」とか「+」とかのネストとかもやばそう。

正規表現だと楽ーとか早いとかいう話は良く見聞きしますが、

やっぱり一概にそうも言えないですよね。

問合せ