mochikoAsTechのdig日記

当方好きなコマンドはdigです!お友達から!!よろしくお願いします!!!

EC2インスタンスに紐付いたIPアドレスはOSを再起動したら変わるか?

AWSEC2インスタンスに紐付くIPアドレスが変わるタイミングについて、ちょっと勘違いして覚えてたので備忘録としてメモ。

EC2インスタンスIPアドレスについて

プライベート IPv4 アドレスは、インスタンスが停止して再起動するとネットワークインターフェイスに関連付けられたままになり、インスタンスが終了すると解放されます。
インスタンスのパブリック IP アドレスが停止または終了すると、インスタンスのパブリック IP アドレスが解放されます。停止していたインスタンスが再起動されると、そのインスタンスには新しいパブリック IP アドレスが送信されます。

ということなので、まとめると以下の通り。

プライベートIPv4アドレスは

  • reboot →変わらない
  • shutdownの後、マネジメントコンソールから起動 →変わらない
  • shutdownの後、インスタンスを削除(terminate)して新しく作り直す →変わる

パブリックIPv4アドレスは

  • reboot →変わらない
  • shutdownの後、マネジメントコンソールから起動 →変わる
  • shutdownの後、インスタンスを削除(terminate)して新しく作り直す →変わる

どっちもshutdownして起動しなおしたら変わるものだと思い込んでたー。

Dockerを使ってRe:VIEWで本が書きたい!~ステップ1:Docker for Windowsを入れよう~

これは何をやりたい人向けのエントリ?

  • 次をすべて満たす人向けのエントリです
    • 技術書典に向けてRe:VIEWで本が書きたい!
    • Dockerを使えば手軽に環境作れるらしいと聞いたので手順が知りたい!
    • 私はWindowsユーザだ!
      • Macは「Dockerの入れ方?・・・ふつーに入れたら入るでしょ?」くらいラクだと聞いたので、ここでは解説しないよ!

前提

  • パソコンのOSがWindows 10 Pro 64bitであること
    • Windows 10 Homeだと、Docker for Windowsを動かすために必要なHyper-Vが使えないので、このエントリで説明する方法は使えないのです
    • Windows 10 Homeの皆さんはWSL(Windows Subsystem for Linux)を使えばDocker使えるようになるので、ここでは解説しないけどそっちの方法で頑張ってください。ごめんね。

自分のWindowsがProかHomeか分からなかったら?

  • タスクバーで「バージョン」を検索して「32ビットと64ビットのどちらのバージョンのWindowsかを確かめる」を開く f:id:mochikoAsTech:20190613231901p:plain

  • バージョン情報の下の方にある「Windowsの仕様」の「エディション」に書いてあります f:id:mochikoAsTech:20190613232114p:plain

「ステップ1:Windows for Dockerを入れよう」の手順

1. Hyper-Vを有効化する

  • タスクバーで「Windowsの機能」を検索して、「Windowsの機能の有効化または無効化」を開く f:id:mochikoAsTech:20190613231511p:plain

  • Hyper-V」にチェックを入れてOK

    • Hyper-V」にチェックを入れると、その下は自動的にチェックが入る f:id:mochikoAsTech:20190613231706p:plain
    • 変更の適用に少し時間がかかる
    • 変更完了したらそのままパソコンを再起動

2. Docker for Windowsをダウンロード

Docker Desktop for Windows is the Community Edition (CE) of Docker for Microsoft Windows.
To download Docker Desktop for Windows, head to Docker Hub.
  • 意訳すると 「Docker Desktop for Windows」は「Docker for Microsoft Windows」のコミュニティエディションだよ。Docker Hubからダウンロードしてね という感じ
  • という訳で言われたとおり素直にDocker Hubからダウンロードする
    • https://hub.docker.com/editions/community/docker-ce-desktop-windows
      • ちなみにダウンロードするには、事前にDocker IDを作ってDocker Hubにログインしておく必要があるよ
      • 未ログインの人は「Please Login To Download」をクリックする f:id:mochikoAsTech:20190613232732p:plain
      • Docker IDには大文字使えないので要注意(mochikoAsTechだとだめでmochikoastechにするしかなかった)
  • ログインしたら「Get Docker」を押してダウンロードしよう f:id:mochikoAsTech:20190613232900p:plain
  • 「Docker for Windows Installer.exe」を落とせたら完了

3. Docker for Windowsをインストール

  • ダウンロードしてきた「Docker for Windows Installer.exe」を実行
    • 「Use Windows containers instead of Linux containers(Linuxコンテナの代わりにWindowsコンテナを使う)」にはチェック不要
    • 「Installation succeeded」と表示されたら完了
      • ボタンを押すと自動でWindowsからログアウトされるので、再びログイン

4. Docker for Windowsを試してみよう

> docker -v
Docker version 18.09.2, build 6247962

f:id:mochikoAsTech:20190613233132p:plain

5. Docker for Windowsの起動確認

  • インストール後はWindows起動時にDocker for Windowsも一緒に起動してくるので、特に何もしなくても起動しているはず
  • タスクバーにDocker for Windowsのアイコンがいて、カーソルを載せると Docker Desktop is Running と表示されたらOK f:id:mochikoAsTech:20190613233709p:plain

6. Shared Drivesの設定

  • タスクバーからDocker for Windowsのアイコンを右クリックしてSettingsを開く f:id:mochikoAsTech:20190613234552p:plain
  • SettingsにあるShared Drivesで「C」(Cドライブのこと)をSharedにしておく f:id:mochikoAsTech:20190613235302p:plain
  • ドライブを共有しておかないと、今後原稿が入っているWindowsのフォルダを、ゲストのDockerコンテナで読み込もうとしたときに失敗してしまうので共有しておきます

注意点

  • もし今後、Shared Drivesをオンにしたのに「Windowsのフォルダをコンテナにマウントできない!」もしくは「マウントしても中身が空だった!」ということがあったら、カスペルスキーなどセキュリティソフトのファイアウォールで止められている可能性を疑いましょう
  • VirtualBoxやVargrantを使うときにはHyper-Vを無効化する必要があるため、これらはDocker for Windowsと同時には使えません

Docker for Windowsが入った!

  • これでDockerが使えるようになったので「ステップ1:Docker for Windowsを入れよう」は完了です
  • ステップ2をお楽しみにー

オミカレに入社して1ヶ月が経ちました!

あなただれ?

@mochikoAsTech です。もちこさんと呼ばれることが多いです。インフラエンジニアをしています。

DNSをはじめよう」や「AWSをはじめよう」、「技術をつたえるテクニック」、「技術同人誌を書いたあなたへ」などの本を書いて技術書典で頒布したりしています。

どこからどこに転職したの?

なんで前の会社を辞めたの?

会社の資本が変わった関係で段々と不自由に感じる点が増えてきたので「世の中には色んな会社があるし、他の会社も見てみようかな!」と転職活動はじめますエントリを書いてみました。

そしてお声がけくださったあちこちの会社さんへ遊びに行ったところ「どこもたーのしー!」となったので、「次が決まろうが決まるまいが辞めよう。よっしゃ、辞めよう!」と年末で職を辞して、しばらくニート生活を送っていました。

note.mu

オミカレ入社の経緯

転職活動はじめますエントリを見たそーだいさんからTwitterでDMが届いたので、「DBでなんか困って検索すると出てくるブログの人だー!」とランチがてらオフィスへ遊びに行きました。

その後、再びランチをしたり、うちに遊びに来てもらったりして、5月からオミカレ入社となりました!

オミカレに決めた理由は?

  • 早々にオファーシートを提示してくれて、かつこちらの状況を汲んで急かさず待っていてくれた姿勢を誠実だなと感じたこと
  • 仕事の話でも仕事以外の話でもそーだいさんの「大丈夫ですよ!」で謎の安心感が生まれて「安定感あっていい人だなー」「この人と働きたいなー」と思ったこと
  • 私の得意なこと、苦手なこと、今は出来ないけど出来るようになりたいと思ってることなどを正直に明かした上で一緒に働きたいと言ってもらえたこと

などが理由です。

あとは結婚されている人、お子さんのいる人も割と多い職場だったので、その辺りの感覚を全部説明しなくても、ある程度認識が共有できるのもありがたいなーと思いました。

入社してみてどうだった?

入社して約1ヶ月経ちましたが、こんな感じで楽しくやっています。

Slackに各自の分報チャンネルがあったり、朝会で日々会社の状況が把握できたり、1on1してたりで色んな意味で社内の見通し・風通しがいいなと感じています。

これは単に会社が小規模であることが理由ではなく、風通しよくあろうと考えて打っている対策がそれぞれ功を奏しているんだなと思います。

小回りよく、でもしっかりと

少人数なこともあって面倒な社内申請や手続きは排除されており、たとえば必要な本などは社内Slackの #payment というチャンネルにURLを貼るとすぐ購入してもらえます。

その一方、リクルートで人事部長をしていた西村さんが社長ということもあって、就業規則や福利厚生は驚くくらいきちんとしています。

椅子やパソコン、モニタは好きなものを

そーだいさんのツイートにもありましたが、エンジニアとして「ありがたい!」と思う福利厚生がばっちりです。

  • 椅子は好きなものが選べる
  • パソコンも好きなものが選べる
    • 「選択肢の中から好きなもの」ではなく、本当に自分が好きなパソコンにできる
    • 「金額に上限は…」と切り出されたので「○○円以下で」と言われるのかと思いきや、「金額に上限はないんですけど、スペックは最低でもSSDの512GB以上、メモリは16GB以上にしてください」とまさかの下限を指定される
  • モニタはダブルでもトリプルでも
    • ほとんどの人がトリプルモニタ
    • 「特にこだわりないです」と言ったら4Kモニタが用意されてた
  • デスク広くて好きなもの飾れる
  • IDEはJetBrainsのライセンス支給でPhpStormやPyCharmが使える
  • ウォーターサーバーデロンギの挽き立てコーヒー、炭酸水はご自由に
  • オフィスは高円寺なので周囲に安くておいしいランチがいっぱい

一方でスタートアップにありがちな「よく分からないところに金をかける」みたいなところはありません。ダーツが置いてあるバーカウンターとか、無駄におしゃれなエントランスとかもないです。その分、しっかり給料に還元されてるなと感じます。

みんなほんとに仕事早くて驚く

現在はオミカレのサイトリニューアルに向けて絶賛開発中なのですが、定期的に「割れ窓デー」が開催されて、「後で直そうと思ってそのままになってたチケット」がガーーーっと片付けられていきます。みんな仕事早くてびびる。

あとは話の方向性を見失ってしまったり、議論はしたものの結論がはっきりしないままになってしまいそうなときに、きちんと軌道修正して短時間で話を着地させられるメンバーが多いので、地味なストレスがなくていい感じです。

直近だとこんなニュースも!

ただみんなが「デキる」分、そこまでドキュメントは整備されていなかったり、そーだいさんがシュバババっと解決したことを後から詳しく共有はしていなかったりするので、その辺りが私の役立てるポイントかなーと思っているところです。

オミカレよいとこ、一度はおいで

私自身、今まで全然使ってなかった技術に囲まれて、日々「わかんない!」とバタバタしていますが、「わかんない」が言える心理的安全性はがっつりあります。

オープンマインドな場所で働きたいな、自分でどんどん考えて役に立ちたいな、という人には向いていると思います。

という訳で…オミカレよいとこ、一度はおいで!

エンジニアは勿論、デザイナーもマーケも積極的に募集中です。そーだいさんもちこさんや、オミカレの仲間たちと一緒に働きたいなーという方はぜひDMお待ちしてます。高円寺でランチしましょー♪

Terraformを0.12にしたらterraform initが通らなくなった話

こんなことで困った

Terraformの 0.11 で動いてた main.tf を使って、0.12の環境で terraform init 流したら、モジュールのアドレス(pathのこと)が解決(resolv)出来ないようっておこらりた。

Error: Module not found

The module address "neko/kawaii" could not be resolved.

If you intended this as a path relative to the current module, use "./neko/kawaii" instead.
The "./" prefix indicates that the address is a relative filesystem path.

エラーメッセージをざっくり訳すと「モジュールのアドレスだけど、 今居るところからの相対パス を意図して書いてるんだったら、 neko/kawaii じゃなくて ./ つけた ./neko/kawaii って書いてね」って言われてる模様。

こうやって解決した

なのでエラーメッセージの言うとおり、モジュールの source = "neko/kawaii"source = "./neko/kawaii" にしたら 0.12 でも terraform init が通るようになったー。

Windows10でTerraformをインストールする方法

試した環境

インストール手順

>terraform version
Terraform v0.12.0

古いバージョンをインストールしたいときは?

WindowsでAWS CLIを使う方法

AWS CLIってなに?

AWSインスタンス立てたり、S3のバケット作ったりするには「ブラウザでマネジメントコンソール開いて、画面でぽちぽちして作る方法」と「コマンド叩いて作る方法」があるんだけど、後者がAWS CLIコマンドラインインタフェース)だよ。

たとえば aws s3 ls というコマンドを叩いて、s3のバケット一覧見たりとかできるよ。

AWS CLIってWindowsでも使えるの?

使える。私もLinuxとかMacのターミナルじゃなきゃ使えないと思い込んでたんだけど、なんとWindowsでもふつーにインストールしてコマンドプロンプトで使えるよ。

WindowsAWS CLIをインストールしよう

$ aws --version
aws-cli/1.14.44 Python/3.6.7 Linux/4.15.0-1039-aws botocore/1.8.48

AWS CLIのセットアップをしよう

  • インストールしたAWS CLIを使うにはクレデンシャル情報が必要だよ

    • クレデンシャル情報っていうのは、AWSAPIを操作のために必要なアクセスキーとシークレットキーのことだよ
    • アクセスキー?シークレットキー?なにそれ…マネジメントコンソールにログインするときのIDとパスワードじゃなくて?と思った人は、「AWSをはじめよう」の「2.5.2 IAMユーザーを作ろう」でP52、P53辺りを読んでみよう(宣伝)
  • クレデンシャル情報を設定するには、コマンドプロンプトaws configure を叩いて対話的に入力するだけ

$ aws configure
AWS Access Key ID [None]: ここにアクセスキー
AWS Secret Access Key [None]: ここにシークレットキー
Default region name [None]: ここにデフォルトのリージョン(東京リージョンなら「ap-northeast-1」)
Default output format [None]: json
  • この aws configure をたたくと %USERPROFILE%/.aws ディレクトリができて、その下に configcredentials のファイルができるよ

    • %USERPROFILE%Linuxで言うところの ~ (ホームディレクトリ)のこと
    • 具体的に書くと C:\Users\mochikoAsTech\.aws だよ
  • config

[default]
region = ap-northeast-1
output = json
  • credential
[default]
aws_access_key_id = ここにアクセスキーが入る
aws_secret_access_key = ここにシークレットキーが入る

AWS CLIの動作確認

動作環境

  • Windows 10 Proの環境で動作確認したよ

PHPでexplodeの後にarray_filterも通す理由を推察してみた

gistでPHPのコードを読んでいたらこんな個所があった。

$array = array_filter(explode(' ', $value)); 

$value には aaa bbb ccc みたいなテキストが入ってる。なので explode をつかって $value をスペースごとに分割して配列にするところまでは分かる。(explode については PHP: explode - Manual を参照)

こんな感じのコードを書いて、

<?php
$value = 'aaa bbb ccc';
$array = explode(' ', $value);
var_dump($array);

実行するとこうなるんだよね。わかる。 aaa bbb cccexplode で分割されて配列になった。

array(3) {
  [0]=>
  string(3) "aaa"
  [1]=>
  string(3) "bbb"
  [2]=>
  string(3) "ccc"
}

でもこれにさらに array_filter かけても、

<?php
$value = 'aaa bbb ccc';
$array = array_filter(explode(' ', $value));
var_dump($array);

実行結果はまったく同じ…んんん? array_filter なにしてるんだ…?( array_filter についてはこちら PHP: array_filter - Manual を参照)

$ php test.php 
array(3) {
  [0]=>
  string(3) "aaa"
  [1]=>
  string(3) "bbb"
  [2]=>
  string(3) "ccc"
}

array_filter って 第2引数に「奇数だったらtrueを返すメソッド」みたいなのを指定して、配列の中から奇数の要素だけをフィルタリングする 的なメソッドだと思ってたので、そもそも第2引数が指定されてないと何してるの…?と。

うーんうーんと考えた結果、恐らく次の2つのケースのときに array_filter が役に立つから使ってるんじゃないかな?と推察したので書いておく。

ケース1. $value が空文字だったときに empty の結果が変わる

次のように $value が空文字だった場合、

<?php
$value = '';

$array = explode(' ', $value);
var_dump($array);
var_dump(empty($array));

$array = array_filter(explode(' ', $value));
var_dump($array);
var_dump(empty($array));

explode だけだと配列に「値が空の要素」が1件入るけど、 array_filter を組み合わせれば要素は0件になる。

array(1) {
  [0]=>
  string(0) ""
}
bool(false)

array(0) {
}
bool(true)

こういうケースなら empty で空かどうかチェックしたときの結果が truefalse で分かれるので、 array_filter がいる意味わかるー。( empty についてはこちら PHP: empty - Manual を参照)

ケース2. $value にスペースが沢山あったときに詰められる

あとは aaa bbb ccc みたいに $value にスペースがたくさんあったとき! こういうときも explode だけだと要素数が7つになっちゃうけど、array_filter を通せばフィルタリングされて値のある3つだけになる。

<?php
$value = ' aaa  bbb   ccc';

$array = explode(' ', $value);
var_dump($array);
var_dump(count($array));

$array = array_filter(explode(' ', $value));
var_dump($array);
var_dump(count($array));
array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(3) "aaa"
  [2]=>
  string(0) ""
  [3]=>
  string(3) "bbb"
  [4]=>
  string(0) ""
  [5]=>
  string(0) ""
  [6]=>
  string(3) "ccc"
}
int(7)

array(3) {
  [1]=>
  string(3) "aaa"
  [3]=>
  string(3) "bbb"
  [6]=>
  string(3) "ccc"
}
int(3)

こういうケースでも array_filter は有用そう!

ただし falsenull があるときには要注意

explode で配列にしたときは、要素はすべて「文字列」として値に入るので、例えば -1 false null を渡した際に、

<?php
$value = '-1 false null';

$array = explode(' ', $value);
var_dump($array);

$array = array_filter(explode(' ', $value));
var_dump($array);

こんな感じで array_filter を通しても全く問題ないのですが、

array(3) {
  [0]=>
  string(2) "-1"
  [1]=>
  string(5) "false"
  [2]=>
  string(4) "null"
}

array(3) {
  [0]=>
  string(2) "-1"
  [1]=>
  string(5) "false"
  [2]=>
  string(4) "null"
}

配列に null やbooleanの false が入る場合は注意が必要そう。

<?php
$value = [ -1, false, null ];
var_dump($value);

$array = array_filter($value);
var_dump($array);

実行してみると、こんな感じでさらっと falsenull の要素がフィルタリングされて消えたー。

array(3) {
  [0]=>
  int(-1)
  [1]=>
  bool(false)
  [2]=>
  NULL
}

array(1) {
  [0]=>
  int(-1)
}

-1 みたいなの負の数は消えないんだね。なるほど。

こういう「人が書いたコードの意図や、どんなケースを想定しているのかを考える」のは楽しいなー。

なお上記は CentOS 6.10PHP 5.6.40CLI環境で確認しました。