読者です 読者をやめる 読者になる 読者になる

Linuxでファイルの行末に文字を加えるコマンド

aaa,bbb,ccc,ddd

みたいな行があるCSVファイルの全行の末尾に、 ,eee を加えたかった。

コマンド

$ cat input.txt | sed -e 's/$/,eee/g' > output.txt

sedコマンドで 行末 $ を置換するという感じでやればOK。

aws-cliのrun-instancesコマンドでEC2インスタンス作成時にtagも同時に付与する方法

aws-cliaws ec2 run-instances コマンドでEC2インスタンスcliから作ることができるが、その際、EC2インスタンスにつけるtag(Nameとか)も一緒に設定しようと思ったが、仕様的にできないらしい。

対応策

仕方がないので、jqコマンドで aws ec2 run-instances コマンドの結果をパースして、 aws ec2 create-tags コマンドに instance-id を渡すようにしてみた。

aws ec2 run-instances [コマンドオプション...] | jq -r '.Instances[0].InstanceId' | xargs -IINSTANCE_ID aws ec2 create-tags --resources INSTANCE_ID  --tags Key=Name,Value=[インスタンスの名前]

2016年書いた記事振り返り

2016年に書いた記事を振り返ってみました。

今年はこのブログ、会社のブログ、他社のブログ合わせて21本記事を書いたようです。 2014年には30本書いたみたいなので、最高記録更新にはならず。

このブログ

13本あるけど、こう眺めるともっと色々書くネタあったんじゃないかなぁと思ったり。

2016-01-01から1年間の記事一覧 - くろの雑記帳

PV数が多かった順に5個紹介します。

kurochan-note.hatenablog.jp

気になったのでちょこっと調べて書いただけなんだけどPVが多い。 ap-northeast-1a とかで調べると一番上に出てくるせいかも。

f:id:kuro_m88:20161231145212p:plain

kurochan-note.hatenablog.jp

サーバーレスアーキテクチャ っていう言葉がどうもしっくりこなくて、それに対する気持ちを書きました。

kurochan-note.hatenablog.jp

cowsay コマンドが入っている環境でAnsibleを動かすと牛が表示されて、ちょっとイラッときた勢いで書いた記事です(笑)

kurochan-note.hatenablog.jp

さくらのIoT Platformのα版に参加させて頂いて、開封レビューをしました。

kurochan-note.hatenablog.jp

今月書いた記事なんですが、たくさんの方に見ていただきました。 自宅で運用しているサーバの紹介です。

会社のブログ

ameblo.jp

2016年入社の新卒エンジニアの研修環境構築を任せてもらったのでそれについて書いたものです。

developers.cyberagent.co.jp

ICTトラブルシューティングコンテストという学生が運営する学生向けインフラ系コンテストに会社から機材(サーバとかルータとか)提供したので、その紹介です。次回も機材提供します。

adtech.cyberagent.io

情報科学若手の会の紹介を会社のブログに書いてみました。

adtech.cyberagent.io

AWSのre:Inventに参加して、現地でそのうちの1セッションを紹介しました。

adtech.cyberagent.io

会社のアドベントカレンダーで業務で開発した機能の一部を紹介しました。

adtech.cyberagent.io

年末にうるう秒の話題が出たので検証方法をまとめたものです。

他社のブログ

他社のエンジニアブログに記事を書くとは思っていなかったのですが、機会があったので。

tsuchinoko.dmmlabs.com

ICTトラブルシューティングコンテストの運営で自動化に挑戦して失敗したときの事です。

ほしいものリスト

もし応援してくれる方がいらっしゃいましたらお願いします(笑)

amzn.asia

来年はもっと書くぞ!

Search Consoleで「トラフィックの処理が完了していません。」と出て困った

画像そのまんまなんですが、

f:id:kuro_m88:20161216212737p:plain

Search Consoleに新しいドメインを追加したんですが、「トラフィックの処理が完了していません。」とか出て何も表示されなくて困りました。

結論

数日〜1週間くらい待てばいいらしいです。
検索ログは残ってるだろうしすぐ反映してくれるのかと思ったんですがそういうわけでもないようです。
気長に待ちましょう。

自宅サーバの思い出 Advent Calendar 2016

タイトルそのままです。

自宅サーバの思い出 Advent Calendar 2016の13日目の記事です。

www.adventar.org

ボタンを押せば希望のスペックのサーバが降ってきて、IPアドレスも付いていて、設定すればアプリケーションもデプロイされて、クラウド刺せばIPアドレスが降ってくる どころの話じゃない。 仕事とかで使う分には本当に楽で良いんだけど、やはり家にサーバがないのは寂しい。

現在の装備

サーバとして使ってるやつとネットワーク機器

f:id:kuro_m88:20161213224941j:plain

  • Fit-PC2
    • CPU: Atom Z530 (32bit CPU)
    • RAM 1GB
    • HDD 320GB
  • Intel NUC
  • NEC IX2105 (ルータ)
  • NEC IX2005 (ルータ)

f:id:kuro_m88:20161213225730j:plain

f:id:kuro_m88:20161213224954j:plain

今持っているものはこんな感じ。

自宅サーバを始めたきっかけ

大学1年生の時に大学の授業とかで初めてサーバにsshでログインして、自分も家で触りたくなったのがきっかけだったような。 当時は自分のものはWindowsのノートPCしか持っていなくて、Linuxのサーバというのはとにかくかっこいい気がしていて、ApacheIt Works! が出るまでのところを自分でやってみたかった。

家族用に自作したPCの予備でHDDは持っていたのと、ノートPCのメモリを載せ替えた余りのメモリがあったので新たに買ったのはマザーボードとPCケースだけ。 安くて消費電力が低いやつを探していたのでAtomD525が載っているマザーボードにした。

VMUbuntuのインストールはやった事があったので、インストール作業自体はそんなに手間取らなかった。 sudo apt-get install apache とか打って、Apacheを入れるのもあっさりできて感動した。

なんか繋がる

家の中でApacheが見られるようになって、今度は家の外からアクセスできるようにしたくなった。 ググると、 ポート解放 なる作業が必要らしい。 ポート解放するためにはルータにブラウザでアクセスして、何か設定が必要だという。 たいていは 192.168.0.1 とかにアクセスすると認証画面が出ると書いてあったけれど、アクセスしても繋がらないというエラーしか出ない。困った。 サーバのIPアドレスを確認しても、 192 で始まっていないし、 12x.xxx.xxx.xxx みたいに見たことない数字で始まっている。(ここで気づくべきだった) ネットワーク勉強したことないからよくわからん、Wi-Fiの設定だけで2日掛かったしやっぱダメかと思いつつ、先程のIPを大学から打ってみた。 すると…

f:id:kuro_m88:20161213232802p:plain

キタ━━━━(゚∀゚)━━━━!! なんと繋がってしまった。そう、後に知ったけれど自宅にプライベートIPなんてものはなくて、グローバルIPが直接降ってきていたのだった。

今だから分かることだけれど、実は家の回線は集合住宅向けのネット接続サービスだった。 最初から用意されているので、家にモデムを置いたこともなければ、そもそもルータなんてものはなかった。 あったのはスイッチングハブだけで、1戸あたり /29グローバルIPが降ってきていた。 NATもファイアウォールもなしに一般家庭のPCがグローバルIPを持っているのは大丈夫なのか…?

楽言えば楽だし複数IP使えるのは嬉しいけど、このせいでNATとかプライベートIPとかグローバルIPの概念が全然理解できなかった。

LXCとの出会い

家にサーバを置いて、用もなく外からsshしていると間違えてシャットダウンさせたり、NICの設定を間違えて疎通を取れなくしてしまったりトラブルはちょくちょく起こしていて、その度に色々と勉強になった。

そのうちホストの環境はあんまり汚したくないと思うようになって、KVMの事も調べてみたけれどCPUがAtom D525という貧弱な環境ではつらくて、そんなにお金ないしなぁと思っていたところに出会ったのがLXCだった。

LXCはLinuxのコンテナ技術で、ネットワークとかディスクのリソースを隔離してくれるのでコンテナ型のVMのような雰囲気で使える。

LXDとの出会い

いつから使い始めたかわからないけど2015年の8月には使い始めていた模様。

fit-PC2は社会人になってから手にいれたけれど、32bit CPUでLXCを使おうにも64bitマシンとバイナリが違って不便だし、ファイル転送するとNICが熱を持って死んでしまって通信できなくなるので疎通監視くらいにしか使えなかったのでIntelのNUCを買った。 Intel NUCは小さくて消費電力も低くて、音も耳を近づけないと聞こえないくらいだけどLXDでいくつかホストを常時起動しておくくらいなら十分な性能。

その後

ネットワーク系の友達にルータ(NEC IX2005)を貰ってしまい、わけもわからず使い方をググっていたり教えて貰ううちにVPNが張れるようになり、気がついたら5人くらいの家とVPNしていて、BGPで経路が勝手に流れてくるようになっていた。 JuniperのSRX300とか欲しくなってきたし、タダより怖いものはない。

最近CiscoのAironetも中古品を買ってしまった。

今後の展望

友達とかの繋がりで、データセンタに個人のサーバを置かせて貰えるかもしれないという話が舞い降りてきた。 ただ、肝心のラックマウントサーバを持っていないのでそれに向けてヤフオクでよさげなサーバを探している。

1UでCPUが6〜8コア 12〜16スレッド、メモリが32GBくらい、HDDが1TB x 2、NICは2本以上のスペックでいいやつが見つかるといいなぁ。

突然自宅を飛び出してDCにサーバを設置することになったけれど、NUC1個くらいは静かだし家で飼っておきたい。

さくらのクラウドでDiskFullになってしまったのでストレージ拡張をした

さくらのクラウドインスタンスを立ててLXDを使った検証をしていて、とりあえずディスクを20GBにして使っていたら気がついたらディスクの空きがなくなってしまい、検証をある程度進めていてインスタンス作り直して手動で構築しなおすのも面倒だったのでディスク拡張をやってみました。

OSはUbuntu16.04で、ファイルシステムext4です。

問題発覚

$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
udev                            983M     0  983M   0% /dev
tmpfs                           201M  8.4M  192M   5% /run
/dev/vda3                        16G   16G     0 100% /
tmpfs                          1001M     0 1001M   0% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                          1001M     0 1001M   0% /sys/fs/cgroup

/dev/vda3 が空きがないのが見てわかります。LXD用のzfsイメージのサイズを大きく割当すぎたのが原因でした。 この時最悪だったのが、適当にコマンドを打つとそのコマンドが刺さって応答がなくなってしまうようになったことでした…。

ディスク拡張作業

インスタンスをシャットダウン

シャットダウンしないと操作できないので一旦シャットダウンします。

f:id:kuro_m88:20161207231836p:plain

f:id:kuro_m88:20161207232125p:plain

容量を大きくした新しいディスクを作成する

ディスク一覧より、新しいディスクを作成します。

f:id:kuro_m88:20161207232255p:plain

この時、空のディスクを作るのではなく、ディスクのソースに20GBの元のディスクを指定します。 こうすることで元のディスクの内容が新しいディスクにクローンされます。

f:id:kuro_m88:20161207232416p:plain

ステータスが完了になるまで(コピーが完了するまで)待ちましょう。

f:id:kuro_m88:20161207232503p:plain

元のディスクをインスタンスから取り外す

停止させたサーバから元のディスクを取り外します。

f:id:kuro_m88:20161207232604p:plain

新しいディスクをインスタンスに接続する

停止させたサーバに新しいディスクを接続します。

f:id:kuro_m88:20161207232639p:plain

f:id:kuro_m88:20161207232817p:plain

サーバ上で認識されるディスクサイズを拡張する

新しいディスクが接続できたら、サーバを起動します。 この状態ではまだファイルシステム上はディスクは拡張されていませんし、 df -h してもリサイズ後のサイズで認識されていません。

$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
udev                            983M     0  983M   0% /dev
tmpfs                           201M   11M  190M   6% /run
/dev/vda3                        16G   16G     0 100% /
tmpfs                          1001M     0 1001M   0% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                          1001M     0 1001M   0% /sys/fs/cgroup

parted -l コマンドでパーティションを確認しますが、この時に拡張済のディスクのサイズとGPT上のディスクのサイズが違う事をpartedが検知してくれるので、ここで修正を行います。

$ sudo parted -l
Warning: Not all of the space available to /dev/vda appears to be used, you can
fix the GPT to use all of the space (an extra 41943040 blocks) or continue with
the current setting?
Fix/Ignore? Fix
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name  Flags
1      1049kB  2097kB  1049kB                        bios_grub
2      2097kB  4297MB  4295MB  linux-swap(v1)
3      4297MB  21.5GB  17.2GB  ext4

修正ができたら、 /dev/vda (接続したディスクの名前) のパーティションサイズを変更します。

$ sudo parted /dev/vda
GNU Parted 3.2
Using /dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name  Flags
1      1049kB  2097kB  1049kB                        bios_grub
2      2097kB  4297MB  4295MB  linux-swap(v1)
3      4297MB  21.5GB  17.2GB  ext4

(parted) resizepart 3
Warning: Partition /dev/vda3 is being used. Are you sure you want to continue?
Yes/No? Yes
End?  [21.5GB]? 42.9GB
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name  Flags
1      1049kB  2097kB  1049kB                        bios_grub
2      2097kB  4297MB  4295MB  linux-swap(v1)
3      4297MB  42.9GB  38.6GB  ext4

(parted)
Information: You may need to update /etc/fstab.

パーティションの拡張ができました。

次はファイルシステムの拡張です。 resize2fs コマンドがよしなにやってくれます。

$ sudo resize2fs /dev/vda3
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/vda3 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 3
The filesystem on /dev/vda3 is now 9424544 (4k) blocks long.

確認

最後に確認をします。

$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
udev                            983M     0  983M   0% /dev
tmpfs                           201M   14M  187M   7% /run
/dev/vda3                        36G   16G   19G  47% /
tmpfs                          1001M     0 1001M   0% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                          1001M     0 1001M   0% /sys/fs/cgroup

拡張できたようです。めでたしめでたし。

追記 (2016/12/09)

前佛さんに自動ディスク容量拡張機能について教えて頂きました!

knowledge.sakura.ad.jp

さくらのクラウドに実装されている「ディスクの修正」機能に対応したパブリックアーカイブのOS から起動した場合にこの機能が使えるようです。
この機能があればサーバ上での作業が減って楽できますね!

DNSのレコードをGitHubで管理 & 自動反映する

最近調布技研という団体のDNSのネームサーバーをCloudflareに変えてみた。 Cloudflareは無料でAPIつきのネームサーバーとCDNが使えてとても便利そうだったので。

www.cloudflare.com

APIつきのネームサーバーが使えるようになったので、レコード管理 & 反映の自動化をやってみた。

DNSレコードをGitHubで管理する

管理するために作ったのがこちら。

github.com

TerraformにCloudflareのproviderがあったので、これを使ってレコード設定を記述するようにした。

Provider: Cloudflare - Terraform by HashiCorp

Cloudflareの設定 (cloudflare.tf)

variable "cloudflare_email" {
  description = "cloudflare email"
}

variable "cloudflare_apikey" {
  description = "cloudflare api key"
}

provider "cloudflare" {
  email = "${var.cloudflare_email}"
  token = "${var.cloudflare_apikey}"
}

上記がTerraformのCloudflare providerを使うために必要な設定で、CloudflareのAPIキーをここに書いても動くけど、publicなリポジトリなので実行時に環境変数で渡すことにした。

レコードの設定 (record.tf)

resource "cloudflare_record" "chofu_tech_A" {
    domain = "chofu.tech"
    name = "chofu.tech"
    value = "151.101.100.133"
    type = "A"
}

resource "cloudflare_record" "www_chofu_tech_A" {
    domain = "chofu.tech"
    name = "www.chofu.tech"
    value = "151.101.100.133"
    type = "A"
}

こんな感じでレコードを列挙していく。ただのテキストファイルなのでこれでプルリクベースで管理できるようになった。

DNSレコードの設定変更が自動反映されるようにする

プルリクのマージ後に自動で実行するためのツールとしてCircleCIを使った。

circleci.com

CircleCIは実行時に渡す環境変数が設定できて、その環境変数は外部から読めないようにできるのでAPIキーを隠しておきたい場合に便利。

TF_VAR_cloudflare_email = "hoge@example.com"
TF_VAR_cloudflare_apikey = "hogehoge"

環境変数はこの2つを設定しておいた。 TF_VAR_ で始まる環境変数はTerraform内のパラメータとして使える。
あとは、CircleCIの設定ファイルに master ブランチに変更があった場合は terraform plan のみ実行(反映はされない)、 production ブランチに変更があった場合は terraform apply を実行(実際に反映される) されるようにして反映が自動で行われるようにした。

chofutech-public-dns-record/circle.yml at master · chofutech/chofutech-public-dns-record · GitHub

これでしばらく運用してみて便利そうだったら自分のドメインもこんな感じで管理してみようかなと思う。