Johnman.md

プログラミングのことや個人的なことを書きます。たぶん。

embulkを使ってS3からGCSにファイルを送る

はじめに

お久しぶりです。
最近AWS S3からGCP Google Cloud Storageにファイルを送信しなければいけないことがあったので、その備忘録的に書こうと思います。

検索するとgsutilコマンドとかStorage Transfer Serviceが出てきますが、いろいろ理由があってこれらは使えなかったので、今回はembulkを使いました。

(今回はあくまでembulkを使ってS3からGCSにファイルを送ることに焦点を当てたので、embulkそのものの設定などについては書きません)

embulk

embulkはFluentdなどを開発した古橋さんが開発したオープンソースのデータ転送ツールです。Fluentdのバッチ版とか言われたりしますね。

github.com

Embulk is a parallel bulk data loader that helps data transfer between various storages, databases, NoSQL and cloud services.

Embulk supports plugins to add functions. You can share the plugins to keep your custom scripts readable, maintainable, and reusable.

とあるように、プラグインを導入することで様々なストレージやデータベースの間でデータをやり取りできます。

今回使ったプラグイン

今回はS3からGCSへファイルを送りたいので、以下のプラグインを使いました。

  • embulk-input-s3
  • embulk-output-gcs

github.com

github.com

設定ファイル

実際の設定ファイルは以下です。

S3上にあるgzip圧縮されたCSVファイルをGCSへ送信します。 embulk-output-gcsプラグインの認証には3種類の方法がありますが、今回はjson_keyを使いました。

in:
  type: s3
  bucket: # S3バケット名
  region: ap-northeast-1
  path_prefix:  s3/example/20200222/
  decoders:
    - {type: gzip}
  auth_method: default
  parser:
    type: csv
    newline: LF
    delimiter: ','
    quote: '"'
    escape: '"'
    skip_header_lines: 0
    columns:
      - {name: "id", type: "long"}
      - {name: "name", type: "string"}
      - {name: "gender", type: "string"}
      - {name: "created_at": type: "timestamp", format: "%Y-%m-%d %H:%M:%S"}
out:
  type: gcs
  bucket: # GCSバケット名
  path_prefix: gcs/example/20200222/
  sequence_format: "user_%02d"
  file_ext: .gz
  auth_method: json_key
  json_keyfile:
    content: |
      {
        "type": "service_account",
        "project_id": "XXXXXXXXXX",
        "private_key_id": "プライベートキーID",
        "private_key": "プライベートキー",
        "client_email": "client@XXXXXXXXXX.iam.gserviceaccount.com",
        "client_id": "123456789",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/client%40XXXXXXXXXX.iam.gserviceaccount.com"
      }
  encoders:
    - {type: gzip}
  formatter:
    type: csv
    newline: LF
    delimiter: ','
    quote: '"'
    escape: '"'
    header_line: false
    column_options:
      created_at: {format: "%Y-%m-%d %H:%M:%S"}

まとめ

今回はembulkを使ってS3からGCSへファイルを送信する話を書きました。

大量のデータを一括で送信したい時にはembulk非常に便利なのでおすすめです。

VPS借りた時にやるべき最低限の初期設定

個人ページの証明書が切れていたんだけど、過去の自分が設定した諸々がわからなくなっててうまく更新できなかった。

なので改めてVPS立ち上げ直して、その設定も諸々残しとこうと思います。この記事はその中の初期設定編。

  • 環境
  • 一般ユーザの作成とrootでのログインの無効化
  • パッケージのアップデート
  • SSH接続できるようにする
  • Firewallの設定(HTTP、HTTPS
  • 参考
続きを読む

【メモ】AWSアカウントを作ったからユーザ周りの初期設定

johnmanji.ro の設定とかもろもろ忘れちゃって、新しくインスタンス立ち上げ直すかと思ってたら ConoHa が障害起こしてた。

これじゃあ何にもできないし、管理大変だから AWS S3 で静的サイトを公開することにした。

今回はそのユーザー管理編です。
けどメモくらいの気持ちなので使ったページを貼っておくよ。

qiita.com

【追記】

Route53 が .ro ドメインに対応してないことが判明。

しばらく ConoHa でやっていくことになりそう

映画『ジョーカー』を観た

注意
この記事は映画『ジョーカー』のネタバレを含みます。
また、書いてある内容はすべて個人の感想です。僕自身映画の評論などに詳しいわけじゃないのでご了承ください。

昨日、10月4日に公開された映画『ジョーカー』を観てきました。

その感想を書こうと思います。

作品概要

本作はDCコミックスバットマン』に登場するスーパーヴィランジョーカーの誕生秘話です。

主人公は人々を笑わせようとコメディアンを夢見る、孤独で心優しい男アーサー。
そんな彼がなぜ悪のカリスマ、ジョーカーになったのか。一人の男が徐々に狂気に陥る過程が描かれています。

その描写の過激さと、以前に公開された『ダークナイト ライジング』のプレミア上映会で起きた銃乱射事件も合間って、海外では映画館が子供に本作を見せないよう呼びかけたり、ロス市警と米軍が警備を強化するなど、異例の対応がとられています。

そんな『ジョーカー』ですが、確かに心に刺さるものがありました。ちなみにバットマンは出てきません。

ここでは個人的にいいなと思った部分を紹介しようと思います。

wwws.warnerbros.co.jp

主演ホアキン・フェニックスの怪演

個人的に魅力を感じた部分として、やはり主演のホアキン・フェニックスの演技は外せません。

本作は、ピエロとして働くアーサーが不良に暴力を受けるオープニングの後、カウンセリングを受けているアーサーがひたすら笑っているシーンから始まります。

アーサーは心を病んでおり、所構わず急に笑い出すという病を抱えています。
そしてその笑い方というのが、本当に苦しそうに笑うんです。
この「笑い」というものが本作の中で非常に大きな意味を持っています。

本作はジョーカーになるまでの過程を描くという性質上、大半がアーサーの描写になっていますが、その中でアーサーが心から楽しそうに笑うシーンは一度もありません。もちろん大声で笑うシーンは多々あるのですが、そのどれもが苦しげな表情で笑っています。

笑うというとてもポジティブな行為をあそこまで苦しそうに演じるホアキン・フェニックスの演技はまさに怪演でした。

何が現実なのかわからなくなる

前述したとおり、アーサーは心を病んでいます。

ストーリーはアーサーの視点で描かれます。たとえアーサーの妄想であったとしても、あたかも実際に起きているかのように描写されます。アーサーにとって救いとなる展開はことごとく妄想です。これらはストーリーの中で妄想だったと判明していくのですが、問題はそのスパンが非常に短いことです。

あるシーンが出てきて、それが妄想だと判明する。このスパンが非常に短いことで、観ている側は何が現実で何が妄想なのかわけがわからなくなってきます。今スクリーンに映されている映像が現実か妄想かはっきりとしないことで、とても不安定な気持ち悪さを心に抱えながらストーリーを追うことになります。そして、ストーリーが進むごとに気持ち悪さは増大していくのです。

むしろジョーカーになった後の方が、考えがはっきりしていて観てて清々しく、気持ちがいいくらいです。

マレーのショーに出るためにピエロのメイクを施すアーサーが見ていた母親の写真。その裏に書かれたT.Mからのメッセージが本物なのか妄想なのか、もう誰もわかりません。

ジョーカーの誕生

ピエロの仕事をクビになったアーサーは、地下鉄で絡まれた証券マン三人を拳銃で殺害します。この事件を機に、貧富の差が激しいゴッサムシティでは、ピエロの扮装をした民衆がデモを繰り広げるなど混乱が広がります。

そんな中アーサーは、母親が精神疾患を抱えていて自分が実は養子だったことが判明したり、恋人だと思っていた女性との関係が全部自分の妄想だったことが判明したりなどして、次第に狂気に陥っていきます。

自分がきっかけとなったピエロの暴動が起こるまで「自分が存在しているかもわからなかった」と語るアーサーは、自分を一人の人間として見ていなかった母親を殺害し、「自分の人生は喜劇だ」と言い放つのです。

その後、以前自分を紹介したマレーの番組から出演依頼が来るとアーサーはこれを承諾。髪を緑色に染めてピエロのメイクを施し、母親の死を悼みに来た元同僚を殺害した後、ショーへと向かいます。

家を出て階段でダンスを踊るピエロ姿のアーサー。予告編でも流れた映像ですが、その時の彼はまさに「ジョーカー」でした。

youtu.be

ピエロの仮面

一人の男が三人の証券マンを殺したことで、ゴッサムシティに広がる混乱。それは、どこかリアルな狂気を感じるものでした。

これは最近僕がSNSを嫌っていることにも起因していると思います。
みな一様にピエロの仮面を被って身元を隠し、匿名的な集団の中の一人としてゴッサムシティを燃やし、警官や富裕層を殺害する彼らには、現代のSNSに似たものを感じました。ゴッサムシティを埋め尽くすピエロたちは、舞台は80年代のアメリカなのに、まるで近未来を見ているかのようでした。

今回はアーサーという男が繰り返し絶望を突きつけられジョーカーが生まれ、周囲の人々にも狂気をばら撒きました。

しかしきっと、誰でもジョーカーになる可能性はあったのだと思います。人は常に細い板の上を歩いていて、バランスを崩した時にあちら側へ落ちるか、こちら側へ帰ってくるかの違いでしかない気がします。

アーサーはきっと、世界中のどこにでもいます。

まとめ

観終わった後は「とんでもない映画を観てしまった」という気持ちでいっぱいでした。
もしそこにピエロの仮面があったなら、それをつけていたかもしれません。

それくらい衝撃的で、自分の内側へ刺さってくる作品でした。好きな映画は何度も映画館で観るんですが、ちょっとこれを繰り返し観るのはきついですね。

けれど間違いなく今年の映画でトップを飾る作品の一つだと思います。

macOSをMojaveにしたらC言語をコンパイルできなくなった

題名の通り。
仕事でも Mojave を使ってるし、そろそろ自宅の Mac Book も Mojave にしていいかと思って先日バージョンアップした。

何かが壊れるのは覚悟していたけど、結論からいうと Homebrew や gcc が動かなくなった。
※今判明しているのがこれらで、多分ほかにも(原因はなんにせよ)動かないものがあると思う。

ちなみに出てきたエラーはこんな感じ。

$ gcc --version
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

目次

Xcodeの再インストール

結論を書くと、アップグレードにより command line developer tools が使えなくなってるので再インストールすればいい。

$ xcode-select --install

これでとりあえず Homebrew なんかは動くようになる。
ついでに gcc-9 を gcc としてシンボリックリンクを貼り直す。

$ ls /usr/local/bin/ | grep gcc
gcc-4.9
gcc-9
gcc-ar-4.9
gcc-ar-9
...
$ ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc

これでとりあえず gcc も最低限動くようになった。

$ gcc --version
gcc (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

/usr/include/にヘッダファイルを追加

しかし、コンパイルしようとすると stdio.h がないと怒られる。

$ gcc hello.c
In file included from hello.c:1:
/usr/local/Cellar/gcc/8.3.0/lib/gcc/8/gcc/x86_64-apple-darwin17.7.0/8.3.0/include-fixed/stdio.h:78:10: fatal error: _stdio.h: No such file or directory

どうやら Xcode 10 からデフォルトではヘッダファイルを /usr/include/ に置いてくれなくなったらしい。
Missing /usr/include w/ Xcode 10 | Apple Developer Forums

これは以下のパッケージを開いてぽちぽちとインストールすれば解決できる。

$ open /Library/Developer/CommandLineTools/Packages

これで無事コンパイルできるようになった。

ふつうのLinuxプログラミング【第1部】で残しておきたいとこ

低レイヤーのことをちょっと学ぶ機運(低レイヤーの定義はおいといて)が高まったので、会社の夏休みを利用して「ふつうのLinuxプログラミング」を読んでみています。
最初はせっかく10連休あるんだからファイアーエムブレム 風花雪月を無限にプレイできるじゃん!なんて思ってたのだけど、よく考えたらそれだけだともったいない。

この一週間で読み終わるつもりではいるので、個人的に忘れたくないところをメモっていこうと思うよ。

ちなみに風花雪月めちゃくちゃ面白いです。
僕の場合50時間でやっと第二部に入りました。おすすめ。

注意
この記事は私が本を読んでメモしておきたいと思ったことを自分なりの理解で書きなぐったものです。
ここに書いてあることが正しいとは限りませんし、これを読んでも本の中身がわかるわけではないと思います。
詳しい内容を知りたい方はご自身で購入されることをおすすめします。

目次

Linuxは3つの軸で構成されている。

本書によると、Linux はざっとこいつらで構成されている。
ここでのストリームは本書独自の用語で、バイトストリームのこと。
プロセスからファイルやデバイスにアクセスする際はかならずストリームを介して行う。
他の本だと単に「ファイル」とかいう風に言われているらしい。

/etc/passwd

ユーザ名とユーザID、パスワードなんかが関連付けられているファイル。

以前セキュリティ関連の研修を受けた際、攻撃方法を学ぶ時に毎回「はい、これで /etc/passwd を表示できちゃうね」という終わり方をしていた。
そのときは「ほーん、なんか名前からして大事なファイルなんやろな」程度にしか思ってなかったのだけど、思ったよりシステムの根幹に近いファイルだった。

こいつを直接扱うのはやめたほうがいい。というかしちゃいけない。

もしこのファイルの中身を使いたかったら API 通して使おうね。

ちなみにグループとグループIDの関連付けは /etc/group にある。

端末もファイル

/dev/tty0 みたいな話。ttyはTeleTYpeの略だそう。知らなかった。
端末もファイルとして抽象化されているから、プロセスからアクセスしたいときは他のリソースと同じようにストリームを操作してアクセスできる。

所感

1部はわりと歴史的な話や、用語の解説が多めでした。
2部からコードを書くことが増えるっぽいから期待。

Learn Kubernetes Basics 終えた【Update Your App】

Kubernetesチュートリアル Learn Kubernetes Basics を一通りやったので、軽くメモした内容を書いておきます。

前回の記事はこれ。

johnmanjiro13.hatenablog.com

Update Your App

ここでは次のことを学ぶ。

  • kubectl を使用したローリングアップデートの実行

Updating an application

アプリケーションのダウンタイムを減らすことと継続的デリバリーの両立を、Kubernetes はローリングアップデートで実現する。ローリングアップデートでは、Pod インスタンスを新しいものに段階的に更新することで、停止時間ゼロで Development のアップデートを実行できる。

ローリングアップデートでは、次の操作が可能。

  • ある環境から別の環境へのアプリケーションの昇格(コンテナーイメージの更新による)
  • 以前のバージョンへのロールバック
  • 停止時間ゼロのアプリケーションの継続的統合と継続的デリバリー

アプリケーションのスケーリングと同様に、外部に公開されている場合、サービスは更新中に利用可能なポッドのみにトラフィックを分散する。