複数のマシンに同時に同じコマンドを送る - pdsh

複数のリモートマシンに同時に同じコマンドを送るツールpdshについて。 hadoop系はsshコマンドを使用してリモートマシンでコマンドを実行することが多く、pdshもよく出てくるので、ここでまとめておく。 ここでは、以下の通り、driverノードからworker1ノード, worker2ノードの2台に同じコマンドを送る例を見ていく。 worker1 ┌─────► 192.168.64.4 driver node │ 192.168.64.3 ───┤ │ worker2 └─────► 192.168.64.5 Installation 基本的にapt, yum, brewなどのパッケージャで対応している。 $ sudo apt install pdsh $ pdsh Usage: pdsh [-options] command ... -S return largest of remote command return values -h output usage menu and quit -V output version information and quit -q list the option settings and quit -b disable ^C status feature (batch mode) -d enable extra debug information from ^C status -l user execute remote commands as user -t seconds set connect timeout (default is 10 sec) -u seconds set command timeout (no default) -f n use fanout of n nodes -w host,host,....

January 1, 2023

公開鍵認証でsshにパスワードレスでログインする

公開鍵を登録して、SSHにパスワードレスでログインする方法を書いていく。ついでに、 その際に使う.ssh/authorized_keyファイルのオプションについても簡単にまとめておく。 ┌─────────────┐ ┌─────────────┐ │ 192.168.1.1 │ │ 192.168.1.2 │ │ │ ssh │ │ │ host_A ├──────────►│ host_B │ │ (client) │ w/o passwd│ (server) │ └─────────────┘ └─────────────┘ ssh_id ssh_id.pub [private key] [public key] クライアントホスト上で鍵を生成する 秘密鍵と公開鍵のペアを生成する ### host_A上 $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa デフォルトでは.ssh/配下に秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成される。 ### host_A上 $ ls -l .ssh/ total 20 -rw------- 1 ubuntu ubuntu 2602 Dec 31 12:39 id_rsa -rw-r--r-- 1 ubuntu ubuntu 571 Dec 31 12:39 id_rsa....

December 31, 2022

Cloudflare Email Routingを使って、Gmailでカスタムドメインのメールを受信する

最近、Emailネタが多くなっている気がしますが。Gmailをカスタムドメインで使用する機能が有料化されて、メールシステムをどうしようか思っているのが関係しているのだと思う。 今までは、メールシステムを自分で作って、運用するという構成法を見てきました。 Docker MailserverでEmailサーバーを10分で立てる Docker MailserverからMailjetにrelayさせてEmailの送信をする Docker Mailserverのメールアカウント管理 ただ、この場合、ホストマシンが必要になるのでやや面倒。無料のクラウドサービスで閉じる方法はないのかと思って見ていたら、多分Cloudflare Email Routingを使うのが一番簡単、安く、早そうだ。理屈はこうだ。 カスタムドメインを確保して Cloudflrare Email Routingでカスタムドメイン宛のメールを全部Gmailに転送する Gmailでメールの受信・管理・閲覧をする 今までGmailで使っていたカスタムドメインをそのまま使うことにすれば良いので、Cloudflareのアカウントを作れば良い。 1. カスタムドメインをCloudflareに登録する Email Routingを使うには、持っているドメインをCloudflareに登録する必要がある。Cloudflareのメニュー「Webサイト」から登録できる。 ちなみに、CloudflareはDNSサービス(無料)や、レジストリサービス(ドメイン保有・管理、卸値価格)もやっているが、Email Routingを使う場合、これらのサービスを使っていなくも問題ない。これらのサービスについては、以下の記事でまとめいる。 Cloudflareで権威DNSサーバを使って独自ドメインの管理をする この記事では、例としてmk01.xyzというカスタムドメインを使う(初年99円くらいで買えるので)。 2. Email Routingの設定 Cloudflareのメニューから、上記で登録したカスタムドメインのページを開く。そうすると、メニューに「メールアドレス」が出てくるので、設定ページにジャンプする。 2.1 転送先のメールアドレスの登録 転送先のEmailアドレス(Gmailのアドレス)を登録する。登録すると、確認メールが届き、認証リンクをクリックするまでは使えない。転送先は複数登録できるようになっている。 2.2 カスタムドメインのDNSにMXレコードを追加 Cloudflareの画面上にMXとSPFレコードが出てくるので、これをカスタムドメインのDNSに登録する。ちなみに、Cloudflare DNSを使っている場合は、自動でやってくれる(さすが)。 今回は、別のDNSサービスを使ってみて、動作するか確認してみた(結論、問題なく動作する。当たり前か。) DNS登録した後は、digで確認してみる。 ### MXレコード $ dig mk01.xyz mx ; <<>> DiG 9.10.6 <<>> mk01.xyz mx ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13446 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;mk01....

February 23, 2022

5分でリモートサーバにプロキシをたててウェブアクセスする

デバッグをしていて、海外からウェブアクセスしたい場合が結構あります。コマンドラインツールだったら、単純にsshでリモートマシンに入って、curlコマンドを打てば良いのですが、jsの実行やグラフィカルなUIのテストをしたい場合は、ブラウザでのアクセスが必要になります。 こういう場合に、リモートにあるマシンにウェブのporxyサーバを立ち上げて、そこ経由でアクセスすることにまります。 proxyサーバはインストールではなく、Pythonスクリプトベースのものがたくさんるので、これを使います。 5分あればセットアップできます。 構成図はこんな感じです。 リモートサーバにPythonのproxyを準備する いろいろあるけど、今回はpython-proxyを使います。 ### リモートマシンのシェル $ pip3 install pproxy $ pproxy -l http://localhost:8899 Serving on localhost:8899 by http sshのポートフォワードで、ローカルのportをリモートのportにトンネルさせる sshのポートフォワードで、ローカルとリモートを繋ぎます。 リモートホスト: 34.95.141.133 ローカルの転送Port: 8080 リモート側の転送ホストとPort: localhost:8899 上記の場合だとこのコマンドでトンネル作成できます。 ### ローカルマシンのシェル $ ssh [email protected] -L 8080:localhost:8899 ... ブラウザでproxy設定をする ローカルのブラウザのproxy設定を以下の通りに変更する。 proxyサーバ: localhost proxy Port: 8080 ブラウザからアクセス この記事で書いた自分のアクセス元のIPロケーションを教えてくれるifconfig.coにアクセスしてみる。 ちゃんとリモートサーバのロケーション情報が返ってきて、proxy経由だとわかる。

February 20, 2022

Youtubeの動画リストをRSSで受け取る

Youtubeの動画更新をSlackに通知するスクリプトを組毛としていたら、YoutubeのAPIを使うにはGoogle Cloudのde APIキーを発行する必要があるとのこと。これはメンドーだと思いつつも、他に手段がないと思っていたので、最初はそれでやってました。 後日、調べたら、YoutubeのチャネルIDからRSSフィードのURLが生成できることを知りました。これを使えばAPIキーなしで、動画のリストを取得できます。もちろん、APIを使った方が検索条件をいろいろ設定できるのだが、今回は動画更新があれば通知するということをやりたいので、RSSで十分だったりする。 チャネルIDからRSSのURLを作る YoutubeのチャネルIDはURLをみるとわかる。例えば、ブラウザでYoutubeに行ってそのチャネルを開いて、 https://www.youtube.com/channel/UC_ak3ZurSDtT3Kv1RFdrgiA というURLであれば チャネルID: UC_ak3ZurSDtT3Kv1RFdrgiA ということになる。 後はこのチャネルのRSSのURLは以下の通りになる。 RSSのURL => https://www.youtube.com/feeds/videos.xml?channel_id=UC_ak3ZurSDtT3Kv1RFdrgiA Python Beautiful Soupを使って日時とタイトルとURLを抜き出す 後は、スクリプトを書けば良いだけになる。RSSのダウンロードはRequestsを、パースはおなじみのBeautiful Soupを使う。 import requests from bs4 import BeautifulSoup ret = requests.get('https://www.youtube.com/feeds/videos.xml?channel_id=UC_ak3ZurSDtT3Kv1RFdrgiA') soup = BeautifulSoup(ret.text, 'html.parser') # contents: List like [('2014-07-02T00:25:08+00:00', 'New Contents!', 'https://www.youtube.com/watch?v=LmR123'), ...] contents=[] for e in soup.find_all('entry'): date = e.published.get_text() title = e.title.get_text() url = e.link['href'] contents.append( (date, title, url) ) 結果を見てみる。...

February 19, 2022

ツールTips: コマンドラインから自分のグローバルIP, ロケーションを調べる

自分がNAT配下にいる場合に、インターネットから見たグローバルIP(出口で自分が使っているGlobal IP)や、地理情報などを調べる方法について。いくつもツールとかサイトがあるけど、経験上、その中でもifconfig.coが一番使いやすいと思っている。 例えば、コマンドラインから、curl(もしくはHTTPリクエストが投げられるツール)があれば、すぐに調べられる。 特に、デバッグなどで、最低限のコマンドしか入っていないゲスト・リモート環境であっても、たいてはcurlが入っていることが多いので、そういった場合に重宝する。あと、ブラウザベースでアクセスしても、グラフィカルに同様の情報を参照できるのもありがたい。 あと、今日日ip addrにまとめられてしまって、使うことは無くなったifconfigと叩けるのもなつかし良い! コマンドラインから自分のグローバルIPを調べる シェルを開いて、 $ curl ifconfig.co 34.95.141.133 ちなみに、IPv6対応なので、IPv6環境だとそのアドレスをちゃんと返ってくる。 ### IPv6環境下 $ curl ifconfig.co 240d:1a:3d4:6412:893e:d8e9:2134:0ffc IPv6環境でもIPv4でのグローバルIPを見たい場合は、curlコマンドのIPv4オプションを使えば良い。 ### IPv6環境下 $ curl -4 ifconfig.co 34.95.141.133 IP以外の情報も返してくれる パス/jsonを加えると地理情報とかも一式返してくれる。 $ curl ifconfig.co/json { "ip": "34.95.141.133", "ip_decimal": 576687493, "country": "Brazil", "country_iso": "BR", "country_eu": false, "region_name": "Sao Paulo", "region_code": "SP", "zip_code": "01323", "city": "São Paulo", "latitude": -23.5475, "longitude": -46.6361, "time_zone": "America/Sao_Paulo", "asn": "AS15169", "asn_org": "GOOGLE", "hostname": "133.141.95.34.bc.googleusercontent.com", "user_agent": { "product": "curl", "version": "7....

February 18, 2022

一時的に受信用でしか使わないメールアカウントを用意する

キャンペーンの申し込みやテスト用などで一時的に受信できれば良いメールアドレスをクイックに用意する手順になります。 前提として、既にDocker Mailserver環境があるものとして進めます。Dicker Mailserverについては以下の記事を参照ください。こちらもサクッと設定できる内容になっています。 Docker Mailserverを構築 前提 既に[email protected]でメールが受信できる環境がある。 この時、一時的な受信用メールアドレスのパターンは以下のようになると思います。ちなみに、全てのパターンでクイックに実施できます。 パターン1: 受信したメールの確認は既存のEmailアドレスで実施する この方式は、メールクライアントは既存のまま使えるので便利。端的に言うと、エイリアスを作って、既存メールアカウントに飛ばす。 ステップ1: 受信するメールアカウントを決める 例) [email protected] ステップ2: 受信メールアドレスのDNSにMXレコードを追加。 MXに追加済みのメールドメイン(つまり、もう実際に使っているドメイン@xxxx.comで)で受信する場合はこのステップは不要。 向け先はDocker Mailserverのホスト 例) other.domain.com. 300 IN MX 50 mail.example.com. もちろん、other.domain.comのDNS権威サーバ上のレコードとして上記を追加。 mail.example.comはDocker Mailserverのホスト名 ステップ3: Docker Mailserverにアカウントを追加 実質は、エイリアスを追加することになる。 ここの例では、 [email protected] で受け取って、 [email protected] に流すので、 (Docker Mailserver上で) $ ./setup alias add [email protected] [email protected] 以上でおしまい。DNSにMXレコード追加するところが若干面倒。 パターン2: 受信したメールの確認はそのEmailアドレスで実施する パターン1のステップ3でDocker Mailserverのsetupコマンドを以下の通り変えるだけ。あとは同じ。 (Docker Mailserver上で) $ ./setup email add [email protected] まとめ 慣れると1分くらいでできる。 ドメインごとにトラックされるのが嫌な場合は、捨てドメインを用意しておく。...

February 15, 2022

Cloudflareで権威DNSサーバを使って独自ドメインの管理をする

独自ドメイン(カスタムドメイン)を取得した後は、ドメインのDNS(権威サーバ)をどこかに立てて運用していくことになる。たいていはドメイン取得業者(レジストラ代行, お名前.comなど)が無料でDNSサービスを提供しているが、おまけ程度なので、貧弱なことが多い。 そこで他のクラウドサービスが提供するDNSサービスを検討してみることになる。 その中でメジャーどころでいうと、AWS Route53だろう。けど、こちらは有償になってくる。個人的に使うのであれば、そこまでSLAも必要ないし、無償で使えるものがいい。 自分が使っているクラウド系で調べてみる、以下のDNSサービスが無償で使える感じだった。 Cloudflare DNS DigitalOcean DNS Cloudflareは珍しくFree TierがあるCDNサービスがベースになっていて、よってCDNと関係の深いDNSサービスも無償で提供される。一方で、Digital OceanはIaaSサービスの一つでDNSサービスがあり、その部分は課金がないということで無償で使える。 どちらも使ったことあるので、個人的な観点で見た特徴を挙げておく。 Cloudflare DNS 無償 CDNサービスと一体感がある(例えば、このAレコードのHTTPSトラフィックはCDNを通してサービスするか、などのオプションがあり、スイッチひとつでサイトがCDN化できる) メールサービスと一体感がある(メールを転送してくれるサービス Cloudflare mailとの連携) DNSのトラフィックモニタが使える カスタムドメインのルート部分から全てCloudflare DNSに預けることになる(サブドメイン階層からCloudflare DNSを使うことはできない) ドメインのレジストラサービスがあり、ドメインの更新料が卸売り値で提供されている(儲けをのせていないので安い) Digital Ocean 無償 シンプルなDNSサービス サブドメイン階層からでもDNSを使うことができる ということで、ドメインの運命を全てCloudflareに預ける形になることをいとわなければ、Cloudflare DNSで良いと思う。 Cloudflare DNSの設定方法 ステップごとに見ていく。ここでは既にCloudflareへのサインアップが完了している段階とする。 登録 自分の持っているドメインのDNS設定をするだけなのだが、先ほども触れたように、Cloudflareはドメイン全体(の運命)を全て預ける形になるため、Websitesとしてドメインを登録する。これによって、ドメインのDNS設定も可能になる。 Cloudflareにログインして、メニューからWebsitesに行く。 その後、ドメインを入力して、Add siteをする。 その後、現状のこのドメインが持っているDNSレコードが全てスキャンされて、自動的にCloudflare DNSに登録されるようになっている。 後は、指示に従って進むと、一段上のドメイン階層(com.)に登録するべきNSレコードの情報が出てくる。 レジストラへのNSレコード変更リクエスト 先ほどの続きで、以下の2つのレコードを一段上のドメイン階層(ここでの例はcom.)に登録すれば良い。 maciej.ns.cloudflare.com natasha.ns.cloudflare.com これはドメインを購入したサービス経由(ひいてはレジストラ経由)で実施する。 Cloudflareではちゃんと登録できたかをチェックする機能もある(抜かりがない?)。...

February 6, 2022

Docker Mailserverのメールアカウント管理

Docker Mailserverを構築した後は、メールアドレスの追加・削除が非常にシンプルにできる。 基本的には、Docker Mailserverに含まれるsetup.shコマンドで管理可能になっている。 メールアカウントの追加・削除・管理 ### 追加 $ ./setup.sh email add [email protected] [パスワードの入力] ### パスワード変更 $ ./setup.sh email update [email protected] [新しいパスワードの入力] ### リスト $ ./setup.sh email list [email protected] * [email protected] ( 572K / ~ ) [0%] ### 削除 $ ./setup.sh email del [email protected] メールアカウントの追加後はdockerコンテナの再起動せずに変更が適用される。 エイリアスの追加・削除・管理 メールアドレス・アカウントを作るのではなく、複数のメールアカウントの受信を一つのメールアカウントで対応したい場合は、エイリアスを使う。 ### [email protected]宛のメール => [email protected]で受ける ./setup.sh alias add [email protected] [email protected] ### 確認 ./setup.sh alias list [email protected] [email protected] ./setup.sh email list * [email protected] ( 572K / ~ ) [0%] [ aliases -> desk@m....

January 31, 2022

Docker MailserverからMailjetにrelayさせてEmailの送信をする

前回の記事ではメール受信にフォーカスして、Docker Mailserverを構築する方法について書いた。今回は、送信部分について設定してく。 スパムメール対策で、どのクラウド/ISPのネットワークでも基本的にoutbound向けの25番ポートはブロックされている(もし開いていると、世界中のsmtpサーバにメールを送りつけるとこができてしまうので)。その辺の事情はこのページにまとまっている。そのため、自前でメールサーバを立ち上げると、ユーザー認証付きでメールをRelayするSMTPサーバ経由で送ることになる。 このメールRelayのサービスは、自分の加入しているプロバイダ(ISP)が提供してくれることもあるし、自分のGmailを使うケースもよく見ます。しかし、メール送信ではスパム対策として機能するSPF, DKIMなどの設定が必要で、これらのRalayサービスだとそこまで細かく対応してないことが多い。 このEmailのRelayサービスはマーケティングツールなどでも使われることから、色々なサービスがある。今回はMailjetを使ってみる。Mailjetは、一日あたりの送信メール数が200通まで無料で使える。使い方にもよるけど、個人として使うには、メール受信(つまりMailjetは無関係)がほとんどで、200通あれば事足りる。もちろん、SPF, DKIMレコードも自動的に生成してくれるので管理がとても楽だ。 1. Mailjetのアカウントを作成する Mailjet メールアドレスとパスワードだけで、サインアップできる。 メールサービスなのに、登録のためにメールアドレスが必要というのは、「服を買いに行くための服」みたいなものだろうか。 2. MailjetでRelayホスト・アクセスキーを確認する MailjetのAccount Settingsを開いて、メニューパネルの中からSMTP and Sender Settingsに入る。 このページでRelayに 使うホスト名 ユーザー名 パスワード ポート番号(=587) を確認。 3. Docker Mailserverの設定 Docker Mailserverのdocumentページに従って、mailserver.envファイルの以下の項目を設定する。 RELAY_HOST RELAY_PORT RELAY_USER RELAY_PASSWORD 設定ファイルを変更した後、再起動。 $ docker-compose down $ docker-compose up -d 4. SPF, DKIMの設定 MailjetはSPF, DKIMのレコードも自動で生成してくれる。後は、その値をDNSに登録するだけだ。なんて楽なんだ! 再び、MailjetのAccount Settingsから、今度は、Setuo SPF/DKIM Authenticationに飛ぶ。 そこに、全てが書いてあるので、その通りにDNS側を設定。 しかも、Mailjet側から設定の検証もしてくれる。 問題なければ下記の通り、青信号になる。 5. メール送信テスト あとはEmailのクライアントから送信できるかを確認する。 送信数や送信先などは、全てMailjetのページから確認できる。 統計情報を出してくれるものありがたい(?)。 参考 Mailjet Docker Mailserver

January 30, 2022