EC2からFTPできなかった

Activeモードだと

500 Illegal PORT command.
ftp: bind: アドレスは既に使用中です

Passiveモードだと

227 Entering Passive Mode (0,0,0,0,234,103).
ftp: connect: 接続を拒否されました

になった。

サーバーは外部管理のもので、Passiveでの接続が保証されているか微妙だったので、Activeモードで接続する方法を探すことに。

VPC内のEC2インスタンスから外部のFTPサーバとデータ転送するときに気をつけること

完全にこの記事に救われた。

ftp.rb
require 'bundler'

require 'net/ftp'
require 'net/ftp/port_command'

ftp = Net::FTP.new('FTPサーバーのIPアドレス')
ftp.port('EIP', 10020)
ftp.login('ID', 'パスワード')

puts ftp.list

# ftp.get 'ファイル名' # データ取得する時
bundle exec ruby ftp.rb

今までろくに触ったことのなかった生のFTPをまさかの2018年に触ることになったお話でした。(触らないまま人生を終えたかった)

まぁわりと勉強になったのでよかった。

GitHub PagesとNetlifyの帯域制限

GitHub Pages

https://help.github.com/articles/what-is-github-pages/

GitHub Pages sites have a soft bandwidth limit of 100GB per month.

Netlify

https://www.netlify.com/tos/

Network Bandwidth: 100GB/month - Soft

どちらも100GB/月。

Railsのテーブル・カラム一覧をCSVで出力

したいというニーズがあった。

のでconsoleから以下を実行した。

csv = ''
tables = ActiveRecord::Base.connection.tables
tables.each do |table|
  begin
    columns = table.classify.constantize.columns.map(&:name)
    columns.each do |column|
      csv << "#{table},#{column}\n"
    end
  rescue
  end
end
File.write('table.csv', csv)

まだApplicationRecordがないプロジェクトだったのでActiveRecord::Baseになっている。

begin-rescueはモデルに対応しないテーブルがあったので入れた。

enumerizeのmultipleの値がモデルを読み直すとなくなる

Railsでenumがサポートされた後もなんだかんだお世話になっているenumerize。

https://github.com/brainspec/enumerize

極稀にmultipleオプションを使うんだけど、そのたびにタイトルの事象になる。
Modelのインスタンス作ってる時点ではちゃんとmultipleな値が入ってるんだけど、保存したものを読み直すとなくなってしまう。

原因は毎回単純で、serializeを忘れているだけなのである。(READMEをちゃんと見よう)

開発環境用にワイルドカード証明書を発行する

プルリクエストがあるたびに自動デプロイしている環境用の証明書を作った。
ブランチ名がサブサブドメインになっているのでワイルドカード証明書が必要だった。

参考

ハマったこと

↓のせいで2回やりなおした…。

  • SANを入れてなかった。
  • SHA-1で署名してしまっていた。

ファイル

san.cnf

$ cp /System/Library/OpenSSL/openssl.cnf san.cnf

した後、以下を各セクションに追記した。

[ req ]
req_extensions = v3_req

[ usr_cert ]
subjectAltName = @alt_names

[ v3_req ]
subjectAltName = @alt_names

[alt_names]
DNS.1 = sub.example.com
DNS.2 = *.sub.example.com

san.ext

以下の内容を書いた。

subjectAltName=DNS:sub.example.com,DNS:*.sub.example.com

最終的な手順

$ openssl genrsa -aes256 -out ca.key 2048
password
$ openssl req -new -key ca.key -out ca.csr -sha256
$ openssl x509 -days 3650 -in ca.csr -req -signkey ca.key -out ca.crt -sha256

$ mkdir demoCA
$ cd demoCA
$ mkdir private crl certs newcerts
$ echo "01" > serial
$ touch index.txt
$ cd ..

$ openssl genrsa -aes256 -out server.key 2048
$ openssl rsa -in server.key -out np.key
$ openssl req -new -key server.key -out server.csr -config san.cnf -sha256
$ openssl ca -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt -config san.cnf -md sha256 

来年にはLet's Encryptがワイルドカード対応するようだし、あまり出番はなさそう。


環境によってうまくうごかないことがわかった。
やはりLet's Encrypt待つほうが無難か。