データレイクのおじさん

Noteもやってます:https://note.com/yukinkoyuki

エンジニアと英語 英語を読む

前回の続き

yk-st.hatenablog.com

今回はラダーシリーズを卒業してからのお話。 ラダーシリーズを卒業するといよいよ、英文の大海に挑むことになる。「よっしゃ、じゃあいきなりハリーポッターやな」と言わずにのんびり行こうというお話。

まずおすすめなのは、ど定番の「Holes」という本

HOLES (English Edition)

HOLES (English Edition)

少年がとある野望のため穴を掘り続けるという小説なのだが、英文も平易だし内容も面白いのでサクサクと読み進めることができる。

ラダーシリーズを突破した方なら、途中途中で意味不明なところはあれど最後まで読み続けることができるはず。

英語の本あるあるなのだが、本読む際に一番難しいのは第一章。登場人物や情景などが浮かばずイメージ読みができなかったりするのだが、ここはグッと堪えて読み(だふり)続けると とあるところから内容がすんなりと入ってくるようになる。

なので最初は苦しくても諦めないで読み続けるようにしてみよう。

そして次が、Small Steps

Small Steps (Holes Book 2) (English Edition)

Small Steps (Holes Book 2) (English Edition)

実はこの本はHolesの続編。主人公の心の成長が書かれていて胸熱になる小説。個人的にはHolesよりも好き。

お次におすすめなのが Wonder

Wonder (English Edition)

Wonder (English Edition)

小学生な主人公のお話、「あー、あるわー」とうんうんいいながら読んでいた。懐古厨にはもってこい。

ここまで読めたら、単語力のパワーアップに再度取り掛かるとGood ハリーポッターさん(一番読みやすい、賢者の石)は「究極の英単語」でいうレベル3は余裕で覚えてるくらいでないと歯が立たず、というザワザワ感。

究極の英単語 Standard Vocabulary List [上級の3000語] Vol.3

究極の英単語 Standard Vocabulary List [上級の3000語] Vol.3

  • 発売日: 2007/05/26
  • メディア: 単行本(ソフトカバー)

だけどここまで読んできたら、多分英語を楽しんでるので焦らずやれば年月はかかれどハリーポッター制覇も夢じゃない。

AWS Subnet内で利用されていないIPを取得する(Pick up dynamically unused Private Ip Address from subnet on AWS )

普通に家で書いて、普通に実務で使ってるもの。

EC2のインスタンスに対して、空いているprivate IP をセカンダリIPとして設定したかったので、空いているIPを動的に取得してその値を用いる必要があった。

コードは以下。

list all private in CIDR

今回は、ドカスカ立ち上がるEMRの中で空いているものを見つけるというもの

少しだけコード紹介

こちらは、EMRがマスターノードかそうでないか?を判定している。 今回は、ワーカーノードには必要のない処理だったのでこの処理を入れている。

isMaster=$(cat /emr/instance-controller/lib/info/instance.json | jq .isMaster)

if ! "${isMaster}" ; then
  echo "slave server"
  exit 0
fi

ここで現在使っている、IPの一覧を取得してip.txtに保存

# consumed ip addres by others including self
aws ec2 describe-network-interfaces  | jq  -r .[][] | grep "PrivateIpAddress" | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | cut -d':' -f 2 | tr -d \" | tr -d , | tr -d " " | sort | uniq > /tmp/ip.txt

対象のCIDRを取得して

cidr=$(ip r | awk '{print $ 1}' | grep '/')

CIDR内におけるブロードキャストIPを利用しているIPとして追加

ipcalc -b $cidr | cut -d'=' -f 2 >>  /tmp/ip.txt

AWSにおいては、最初の4つと、ブロードキャストを除いて、一番後ろのIPは予約されているので、そちらも利用一覧に追加する

nmap -sL $cidr | awk '/Nmap scan report/{print $NF}' | tr -d '()' | sort -V |  head -n 4 >>  /tmp/ip.txt
nmap -sL $cidr | awk '/Nmap scan report/{print $NF}' | tr -d '()' | sort -V |  tail -n 1 >>  /tmp/ip.txt

CIDRにてとりうるIPの全て

# list adresses
nmap -sL $cidr | awk '/Nmap scan report/{print $NF}' | tr -d "()" > /tmp/ip_range.txt

あとはip_range.txtにあって、ip.txt似ないものを探している。

while 
¥¥¥¥

gist連携やってみたかった

Embulk vs Mysqlのハマりポイント

取り込みの業務ででEmbulkを使っていると(個人的にsqoopよりembulk派)思わぬところでつまづく時がある。

mysql pulginとparquet用のプラグインを組み合わせて利用している(orcも)。

MysqlのtmpSpaceがたりない。

洗い替えのパターンなどで、大量のデータを抜き出しているときに起こりやすい。 単純にtmpspaceをあげればいいのだが、根本的な解決にはならないので無理やり抜き出すのをやめて、日時のみなど日付単位で抜き出すことを検討する方向に切り替えた方後々嬉しい。

booleanに気をつける

mysqlだとtinyint(1)がbooleanの定義だが、tinyintなので255くらいまで値が入ってしまう。これを何も考えずに抜き出してしまうと、本来2などの数字が入るべきところが0、1のbooleanに 変更されてしまう。。 JDBCのオプションにtinyInt1isBit:falseを付けよう embulk(liqid)だといこんな感じ options: { tinyInt1isBit: {{ env.TINYBIT }} }

タイムゾーンが設定されていない。

対RDSから取り込むときに多いイメージ。mysql プラグインはタイムゾーンを自動で取得してくれないので、 個別で設定をする必要がある。 options: { useLegacyDatetimeCode: false, serverTimezone: Asia/Tokyo }

BLOBやBINARY、JSONは、デフォルトでstringにしておくとうれしい。

liquidテンプレートを使うことになると思うので、デフォルトのカラムオプションを設定しておくと楽。 VARBINARYという型があることを、ハマって初めて知りました。。。

remove colは組み込み存在する

フィルター用のプラグイン入れずにすみました(そんだけ)!

実はぜんぶstringで抜き出すのが楽

embulk + hiveやらなんやらでETLする場合は、値が変にならにようにstrngで抜き出してしまうのが一番楽。 Hiveなど後続のSQLが事前に定義されたスキーマにいい感じで値をキャストしてくれる。

ただ、それだとETLはシンプルにはならないので、チームの状況とかリソースを鑑みて、そのときどきでよささおうな選択をするのがいい。 特にsqoopなどのシステムからの移行時は、既存のデータの状態を守らないといけないので、一致させることに苦労するので、バランス大事(戒め)

embulkって優秀よね

embulkは一度、テンプレートで設定してしまえば取り込みの運用業務の負荷を大幅に減らすことができます。 sqoop + 内製ETLツールだと3時間かかっていた作業や取り込みが(無駄の多い作業でした。。)、30分ほどでプロダクションインできるようにまでなりました。

AWSのプライベートサブネットに配置すると言うこと

プライベートサブネットで運用するとは?

面倒くささと引き換えにセキュリティとして安全であるということ。

要件が許すのであれば、全部パブリックが嬉しいいがそうもいかない。仮に要件がそうなっていなかったとしてもデータの安全性を考慮するのであれば、インターネット経由で出ない方がお金的にも、運用的にも(NAT)、セキュリティ的にも嬉しい。

データエンジニア が利用するサービス

EMR ワークフローエンジン構築 athena など分析系のサービスが多いのと、他のサービスと同様に、S3が中心になることが多い。

プライベートサブネット上のインスタンスからS3にアクセスするには?

原則同一リージョンであれば、VPC gatewayをを経由して、プライベートな通信が可能だし、そうするべき。

しかし、別リージョンににアクセスする際は、インターネットとの通信が必要になるので、NATなどの外に出るためのコンポーネントが必要になってくる。

Natなど外に出る経路がないプライベートサブネット内で、カリフォルニアのリージョンで試すとこんな感じ。

aws s3 ls s3://tokyo/ --profile eval --region us-west-1
アクセスできない

aws s3 ls s3:// us-west-1/ --profile eval --region us-west-1
アクセス可能

当然だけど、必要のない限りリージョン間の転送料金がかかるので、通信は同一のリージョン内に納めておくのがベター。

EMR

EMRは大きく分けて、EMR serviceと言う、リージョンに存在するサービスと、クラスター(EMR serviceによって立ち上げられる)コンポーネントでできている。例えばプライベートサブネット内のインスタンスにおいてboto3 経由で特定のクラスター(同一VPCでも別VPCでもOK、別リージョンはNG)にadd stepや、describe-clustersを投げた時。

通常は、インターネット経由でこのEMR serviceにコマンドが到達し、Emr serviceからインターネット経由(プライベートなEMRであればENI(プライベートリンク)経由)とアクセスを代行してくれる。

図で表すとこんな感じ

f:id:yk_st:20200628200509j:plain
public
f:id:yk_st:20200628200506j:plain
private

一枚目に記載忘れましたが、EMR-serveiceから各クラスターへは2枚目(private)と同じです。

このprivate subnetから各AWSのサービスにアクセスするための経路をprivate linkと呼んでいるそう。 これを実現するには、private subnetに対象サービスへのネットワークインターフェースを追加する必要があります。

terraformのソースは以下のような感じ。

resource "aws_vpc_endpoint" "emr_service_endpoint_attach" {
  service_name      = "com.amazonaws.${data.aws_region.current.name}.elasticmapreduce"
  vpc_endpoint_type = "Interface"
  vpc_id            = "${aws_vpc.vpc.id}"
  subnet_ids        = "${aws_subnet.vpc_subnet_private.*.id}"
  security_group_ids = [
    "${aws_security_group.workflow_security_emr_service.id}",
  ]
  private_dns_enabled = true
  tags = {
    department = var.department,
    Name       = "${var.department}_workflow_emr_service"
  }
}

ちなみに、同時に使うことが多いであろう、glueも同じような仕組みになっています。

Fargate

コンテナになってくると、さらに複雑かつ必要性が増してきます。

コンテナの起動には、以下のエンドポイントが必要です。

  • logs(cloud watch)
  • s3
  • dkr(コンテナのイメージをecrからpullしてくる)

また、コンテナのイメージをインターネット経由でALBやNATを通して、ダウンロードしてきたりすると(データ基盤のコンテナイメージはデカくなりがちです、10Gとか普通(結局そっちの方が効率いいから詰め込んじゃえ的な)、値段が一気に跳ね上がり死亡します。 そのため、コンテナのpullはお金的にも、セキュリティ的にもプライベート経由での実施が好ましいというかマストです。

当然ながら、このコンテナの中からEMR serviceやGlue API gatewayなどなどのサービスにアクセスしようとした時も、privatelink の設定が必要なります。

バランス

個人的にですが、基本的にはprivate。特にマルチテナントで様々な人がいじるような環境の場合はprivateにするようにしています。 インターネットにアクセスと言う強力なツールを様々な人に与えると、何をされうるか判ったものではありません(たとえ社内の人だとしても)。また、外部からの攻撃は防ぎやすいですが、内部からの攻撃(いろいろな意味で)はなかなか防ぎきれないものです。

逆に、各テナントごとに好きにして欲しい場合などはVPC単位で分けて、利便性を優先してパブリックなサブネットに配置していることが多いです(当然IPの制限などは行います)。

この時にこれと言う、正解はないのですが私はこんな感じで考えて選択をしています。

理解して選択しているのと、知らずして選択しているのでは訳が違うので何がなんでもパブリックに置いて「よっしゃうごいた」というレベルから「運用可能な」レベルまで持っていけるように常に考えていきたいものです。

エンジニアと英語 語彙力は戦闘力 リーディング

語彙力は戦闘力

これに尽きる。リーディングをする際に必要なものは

  • 背景知識(全く意味不明なものは、日本語でも読めない)
  • 語彙力
  • イメージ力(日本語に訳さないために必要)

この3点があるだけで、読める本や文献は相当増えてくると思う。

 

背景知識

日本語で内容を知っているのと、知らないのでは天と地ほどリーディングの落とし込みに差が出る。英語を読むにも一般的な知識が必要と感じるところ。

日本語でもいいので、日頃からニュースをみたり興味のないことでも言葉くらい聞いておくといざ知らない英文に当たった時に底力が出る。

 

語彙力

アルクさんが出しているSVLを参考にしてみるといい。

SVLとは、文章の中に出てくる頻出単語を順番に並べたもの。12レベルに分かれており、それぞれ1000語で構成されている。

 

普通に勉強した、中学校の坊や:3000
普通に勉強した、高校生の坊や;6000
普通に勉強した、大学生の坊や:9000(英語の専攻)

 

英検の準1級が7000くらいなのと、多くの学生が準1級も挫折するという。

 

12000までは、語彙力を強化すると言う時間をまとめて取りつつ、到達したらあとは自然の文章や、音声から知らない単語を引っ張ってくる勉強がおすすめ。

 

Harray Potterの賢者の石などは10000は最低到達していないと手も足も出ない。

子供向けの本でこのレベルをようしてくるので、大人向けの本などはもっと必要になる。

 

本については、ラダーシリーズなどの単純な本からはじめ、飽きてきたら、小学1年生が読む本など順々にレベルを上げていくといい。

 

ラダーシリーズ。

大事なのは、日本語に訳さないこと。あとで紹介するイメージを駆使して読み込む。

www.amazon.co.jp

 

ラダーシリーズを卒業したときの最初の本はいかがおすすめ。

平易な英語で記載されているのと、内容が面白いです。

www.amazon.co.jp

 

イメージ力

感覚と言ってもいいかもしれない。

どの単語にも言えるのだが、単語に対して逐一日本語を割り当てていたのでは、一向に英語は上達しない。

 

例えばdevelop 日本語だと発達するとか、開発するとキリがないくらい大量の日本語の単語がくっついてくる。

 

上の日本語からみるに、発達とか、開発は、小さいものが大きくなっていくイメージを持つといちいち日本語に訳さなくてもいいなぁと考える。そうすると

 

after developing feverと言う英語をみた時に、「熱が発達する?」「熱を開発する?」などと思わずに「熱が大きくなっていく -> 熱が上がったんだなー」のように理解をすることができるようになって、書籍を読み込む時に脳のリソース削減んも繋がる。

 

イメージ力を育てるには以下の本がおすすめ。

全部で3冊出ており、これを日本語に訳さない精神で読んで聞くとラダーシリーズのレベル1が日本語に訳さず読めるようになっているはず。

www.amazon.co.jp

 

日本に在住して、通常の仕事をしている人はこのリーディングから英語を勉強したり情報を得ることが多いので、戦闘力向上のために、イメージを大切にしていくと後々その恩恵を預かれる。

 

次回はリスニング

俺のリモートワーク 快適と生産性を両立する小物以外編

コロナの影響で急遽リモートワークへ切り替え

私の会社でも、コロナの影響でリモートワークに切り替えることになり、はや3ヶ月が経ちました。

リモートのために借りたと言っても過言ではない部屋で、いつしか来るその日のためにノロノロと準備をしていました。最近になって比較的満足のできる俺の部屋が出来上がったので、紹介しようと思います。

 

部屋の間取り

4.5畳のお部屋で、北向き。窓つきのお部屋です。

北向きを選んだのは、

  • 南向きだと暑い
  • 風の通り道でめちゃくちゃ涼しい
  • 部屋は窓を閉めればそこそこ暖かい

と、夏のことを考えて選択したお部屋でした

 

また4.5畳は広さ的にもちょうどよく、無駄なものがおけないので仕事や、お休みの日にお勉強したり、色々やったりする部屋にぴったしでした。

 

 

俺の部屋

きたない

f:id:yk_st:20200627140352j:plain

リモート部屋

 

私は寂しがりやなので、お洒落に、気取ると言うよりガラバゴスのようにごちゃごちゃとしている環境が好きで、プライベートで使っているPCも同じへに置いて、youtubeとかを流すのに使ったりしています(本当に流しているだけで、ガヤガヤ感を楽しんでいる。)。

 

デスク

デスクは、横幅、180cm 奥行き80cmのものを利用しています。近すぎると目が痛くなるので、大きめのものを利用しています。さらに、別の机とコンボし、部屋の一面を机で埋めて、完全に仕事スペースに変貌させています。

 

item.rakuten.co.jp

 

モニター

4k *2台

USB-Cドッキングがついている、4kでお安いモニターを探していたらこちらにぶち当たりました。このモニター安いんですが、、かなり多機能で、USBハブにもなったりするので、デスク周りをすっきりさせるには、もってこいのモニターでした。

www.amazon.co.jp

 

そしてもう一台がBENQ

こちらはメインモニターとして現在利用しています。

www.amazon.co.jp

 

HD 1

こちらは、実家から送ってもらったシャープさんのテレビが見れるVESAマウントつきのモニターです。テレビなのにマウント規格がついており、持っているディスプレイアームを利用できるのが思わぬ誤算でした。

コンフルの編集や、編集頻度の低いけどたまに見たくなるような画面開いておいて利用しています。

 

PC

会社から貸与された、macbook pro13インチです。

13インチはモニターの出力が2大までしか対応していいないので、グラフィックアダプタを上記のフィリップスのモニターに接続して3台表示を可能にしています。

 

椅子

椅子はクエトというちょっと、アーロンチェアに似ているようで似ていない、椅子を利用しています。

その上に、豆腐くんクッション(誰?)と奥さんが持ってた授乳用のクッションを背中におき、長時間の着席を可能に。

www.nitori-net.jp

 

また、足が短いフットレストを足元に置いて、足の疲れやむくみが発生しないように、気を使っています。

 

やはり、地べたにすわったり、会社で小さいモニターでやっているとき(借りるのが億劫で13インチのモニターだけでやってた)より格段に生産性が上がっています。サクサクと新しいこともできるし、一人で考え込む時は考え込める。

 

机を椅子を揃えるだけで、集中力全然違うと思うので、迷っている方は是非椅子と、机から揃えてみてください。

 

次回はキーボドや、マウスなど小物編。

terraform で既存のS3バケットの情報を引っこ抜いてくる

既存との戦い

一から作るサービルならまだしも、 歴史のあるサービスを移行するときなどは、元々の状況を活かしつつ、新しい価値を生み出していくことが求められる。

とかっこいいことを言ってみたものの、 今回は既存のS3バケットの設定を持ってきて、そのバケットに対してライフサイクルの設定などを行いたい! そのため、今まで手で行ってきたものをコード化しようと言う試みです。

 

構成

env

    stg

       - main.tf
       - backend.tf (s3をバックエンドにしている)

 module
          s3 

            - main.tf

stg配下のmain.tfに記載されている、S3モジュールは以下のような設定です。

module "s3" {
  source = "../module/s3"
  providers = {
    aws.oregon     = aws.oregon
  }
}

ライトにS3から

今回はterrafrom importを使って既存のS3バケットの設定を取り込んでいこうと思います。

s3配下のmain.tfに対して、以下のように取り込みたいリソースを記載します。

resource "aws_s3_bucket" "test-sample-sample" {
  provider = aws.oregon
}

env配下に移動し以下のコマンドを実行します。 ちょっとしたコツはmodule.s3.のように絶対パスで対象のリソースまでの道筋を指定することです。 module.s3がないと、対象のリソースを見つけることができず、importすることができません。

terrafrom import resourceまでの絶対パス バケット名 の記法

terraform import module.s3.aws_s3_bucket.test-sample-sample test.sample.sample

取り込み完了です

あとは、terrafrom palnなどで差分がなくなるように調整し完了となります。

作業の簡単里は裏腹に、本番環境とかにこれをやるのはドキドキする。。

そっちの方が大変なんじゃないかと思う今日この頃