2020-10-02
10:50
起きたのは9時で株式市場が動いてる事を確認したりして、あまりにもダンボールとかが多かったのでまとめたりしてとにかく掃除をした。進捗率15%。切符とかを何とかしたい。ていうか平日の9時から11時ごろまで掃除してるって生活は何とも異常だ。こんなに時間あるならちゃんと毎日やっておけばいいのにね(できない)。
11:30
AWSアカウントを2つ申し込みしつつ、飯を炊く、炊きつつ、国勢調査を書こうかなーと思ったんだけど今日日やっぱりインターネットがいいか…
11:45
国勢調査オンライン手軽すぎてワロタ。10分かかってないかも
12:50
飯くったっぽ
— ー (@gozapon) October 2, 2020
これ出すのしんどい。snippet欲しい。
13:30
ダラダラしつつ再開。でも今日はあまり仕事しない、てかほとんどしない。 レシートを記録して、まああとコーヒーとか飲みながら音楽でもやってるか(グヘヘ
、と思ったけどCIの記事書きたい。遊ぶのはCI書いてからにするか。
、と思ったけどCIやめ。止まってるAWSの環境やる。
止まってるAWS
cloud-init
でハマってごちゃごちゃやってたんだっけ。。。
cloud-init
をテストするというか終了したり開始したりするとIP変わっちゃうからEIPを付けておくか、起動時にDNSを設定しに行くよにするのが100倍楽でしょう。コンソールからだと結果取れるけどterraform cloudだと面倒くさいから。
ただ、テンプレとして使うにはちょっと組織固有になっちゃうので、そこは面倒な所ではあります。ま、EIPにしたってそうなんだろうけど。
1data "aws_route53_zone" "example-domain" {
2 name = "YOUR.DOMAIN"
3 private_zone = "false"
4 }
5
6resource "aws_route53_record" "web-public" {
7 zone_id = data.aws_route53_zone.example-domain.zone_id
8 name = "YOUR_HOST"
9 type = "A"
10 ttl = "300"
11 records = [aws_instance.web.public_ip]
12 allow_overwrite = true
13}
terraform
でやるならまあ、こんな所でしょう。ただし、これはロードバランサを通さないという前提。
cloud-initって?
cloud-initってのはAWSのホストの中に入ってる構成スクリプトでcloud-init
ってコマンドもあるんですが、まあむずいので最初はとりあえず「こうやったらこうなる」的な理解で進めざるをえないと思う。ここでやるべきはボリュームのマウントとかホスト名の変更とかである。ユーザの作成もやってもいい。やってもいいというのは、どのみちマシンイメージは作り直しになる事うけあいなので、そっちで作っちゃってもいいぞっていう事、どっちでもいい。
でも、ここではcloud-initを取り上げているので、やれる所までやってみよう。
1#cloud-config
2merge_how:
3 - name: list
4 settings: [append]
5 - name: dict
6 settings: [no_replace, recurse_list]
7
8hostname: ${hostname}
9fqdn: ${fqdn}
10timezone: "Asia/Tokyo"
11
12#package_update: true
13#package_upgrade: true
14
15users:
16 - default
17 - name: user
18 gecos: "Default User"
19 sudo: ["ALL=(ALL) NOPASSWD:ALL"]
20 groups: users
21 ssh_authorized_keys:
22 - "ssh-rsa ...."
23 shell: /bin/bash
24 lock_passwd: True
とまあ、こんな感じでssh_authorized_keysには自分の「公開鍵」を書きます。これでuserが出来ている事を確認できればok。でも、実はホスト名を変更したら再起動せにゃならんのだった。
ボリュームをマウントする
ボリュームはweb consoleから作っておかにゃならんという事。コマンドで何でもできるわけじゃない。で同じAZに置かないといけない(ここ重要)。というわけでここまで用意しときます。ちなみにボリュームには検索して取れるように適切な「タグ」を振りまうす。
terraform
側からやる事はこの作っておいたdataを検索して取ってきてアタッチする事です。
1 "aws_ebs_volume" "web-data" {
2 most_recent = true
3
4 filter {
5 name = "tag:Project"
6 values = [local.workspace]
7 }
8
9 filter {
10 name = "tag:Env"
11 values = [var.env]
12 }
13}
14
15resource "aws_volume_attachment" "web-data" {
16 device_name = "/dev/sdf"
17 volume_id = data.aws_ebs_volume.web-data.id
18 instance_id = aws_instance.web.id
19}
こんな感じでfilterから見つけてこれるようにして、/dev/sdfにアタッチします。ここでご覧の通りterraform側ではAZは全くわからんという事になるのでAZが間違っていてもterraformはvalidになりますが、applyする時にエラーになって終わります。チーン。
ディスクを「フォーマット」する
っていう言い方でいいのかわからんが、パーディションを作ったりファイルシステムしたりします。
1# cfdisk /dev/xvdf
2# mkfs.ext4 /dev/xvdf1
3# tune2fs -r0 /dev/xvdf1
とか
でmount
1# mount /dev/xvdf1 /mnt
これ、↑この作業っすね。
1mounts:
2 - [/dev/xvdf1, /data, ext4, "rw,noatime", "0", "0"]
3
4power_state:
5# delay: "+10"
6 mode: reboot
7 message: Bye Bye
8 timeout: 30
適用すると
1$ df -h
2Filesystem Size Used Avail Use% Mounted on
3/dev/xvda2 7.8G 1.1G 6.4G 14% /
4udev 10M 0 10M 0% /dev
5tmpfs 200M 4.2M 196M 3% /run
6tmpfs 500M 0 500M 0% /dev/shm
7tmpfs 5.0M 0 5.0M 0% /run/lock
8tmpfs 500M 0 500M 0% /sys/fs/cgroup
9/dev/xvdf1 14G 35M 14G 1% /data
とかってなると思います。
15:20 ちなみにこれで
進捗率50%くらいです(笑)
つか、今回の構成要件を整理してみる。
- 単にデモ用、確認用、ステージングですらない本当に確認
- ちょっと見たら落としてもいい、むしろ落とせ
- じゃあDockerとかの方が楽じゃん、まあいいか
- 落とす場合「終了」じゃなくて「停止」でもいい
- ちょっと見たら落としてもいい、むしろ落とせ
- とはいえVPCくらいはちゃんと切りたい
というわけで、まあ、ぼちぼちやっていきまショウ。
18:45
というか、ここまでで気付いたんだけど「停止」して「起動」する場合やっぱEIP当てないとダメでしょうねえ…
以下のチュートリアルを読めばとりあえず無理無理停止する事はできるようになるんじゃないかと思います。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/
ただ、このチュートリアルのイマイチな所は
- とにかく停止するだけ
- インスタンスIDがベタ打ち
ただし、学べる事も多い
- 関数の作り方
- 関数を実行するroleの当て方(この場合だとEC2と起動/停止し、ログに書き込む権限を与えればいいという事が理解できる)
- イベントのテスト発動のやり方
- イベントのスケジュールの実際の仕掛け方
これを、もう少し発展的に改良していくといいと思うけど、時間がないからとりあえずここまで
19:20
音楽をする
3:50
起きた。アレ…