Certificate Manager で取得した証明書が、CloudFront で選択できない

Certificate Manager が 東京リージョンでも取得できるようになりましたが、
CloudFrontは、バージニア北部 (us-east-1) で取得した証明書でないと設定できません。

よくある質問 - AWS Certificate Manager(簡単に SSL/TLS 証明書を作成、管理、配置) | AWS

米国東部 (バージニア北部) リージョンでプロビジョンされ、Amazon CloudFront ディストリビューションに関連付けられた証明書が、お客様のディストリビューションに設定された地理的場所に配信されます。

Lineのメッセージで、URLが展開されない

Line の チャット画面上で、 OG情報を展開させるには、
http または、httpsプロトコルsslv3(脆弱性があり利用停止が推奨されている)に対応させるひつようがあり、
httpsプロトコルTLSだと表示されません。

おそらく数年以内に改善されるはずです。

NginxでUnicornが別Portへリダイレクトしてしまう

$http_host は ポート含む
$host は、ポート含まない

たとえば、このような経路でサイトを表示させるとき、
ブラウザ =(80)=> Cloud Front =(8000)=> ELB =(80)=> Nginx =(socket)=> Unicorn
このようにポート8000にして通過させると、Unicorn 側に 8000ポートでアクセスしたことになってしまう。

location @unicorn {
    set $proto $scheme;
    if ($http_cloudfront_forwarded_proto = "https")  { set $proto "https"; }

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $proto;
    proxy_set_header Host $host;
    # proxy_set_header Host $http_host;
    proxy_pass http://app_sock;
}

Rails で Base64 エンコードされた文字を Carrierwave で保存する最も良い方法

File クラスを使うと、ストレージの読み書きが発生し、速度が落ちるため、メモリ上だけで処理を行う方針。
File クラスと同じ処理をするため、メソッドを定義する。

class StringFileIO < StringIO

  def self.create_from_canvas_base64 str
    return nil if str.nil?

    head, data = str.split ",", 2

    return nil if data.nil?

    _, mime_type = head.split /:|;/

    bin = Base64.decode64 data

    self.new bin, mime_type
  end

  def initialize blob, content_type
    super(blob)
    @content_type = content_type
    self
  end

  def original_filename
    "image"
  end

  def content_type
    @content_type
  end

end


あとは、代入するのみ

class User
  def image_str= str
    self.image = StringFileIO.create_from_canvas_base64(str)
  end
end

Wordpress で visual editor の タブが表示されないとき

  • 原因不明だが、'wp-includes/js/tinymce' フォルダを、再ダウンロードしたファイルで置き換える
  • User > Your Profile ページの Visual Editor にチェックが入っている
  • nginx などで、user agent に、empty の文字列を渡している

というのありえるようだ。

CloudFront 使用時、scheme を取得する

CloudFront を使用時、https での通信でも、nginx の $scheme に http が入ってしまっている。

CloudFront-Forwarded-Proto ヘッダーに、original の scheme が入っているので、それを利用する。

CloudFront

Whitelist Headers に、CloudFront-Forwarded-Proto を追加。ホワイトリストというよりも、ヘッダーの追加。

Nginx

http_cloudfront_forwarded_proto が https であれば、 scheme を上書きして、次に流す。

location / {

    set $proto $scheme;
    if ($http_cloudfront_forwarded_proto = "https")  { set $proto "https"; }

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $proto;
    proxy_set_header Host $http_host;
    proxy_pass http://app_sock;
}

ActiveAdmin で、belongs_to, accepts_nested_attributes_for を設定したmodelも同時に表示・編集する

ActiveAdmin で、belongs_to, accepts_nested_attributes_for を設定したmodelも同時に表示・編集する

ActiveAdmin.register UserLogin do

  # ... 

  form do |f|

    f.inputs nil, for: [:user, f.object.user || User.new] do |fc|
      fc.input :icon
      fc.input :full_name
      fc.input :is_deleted
    end

    f.inputs nil do
      f.input :email
      f.input :password
      f.input :password_confirmation
      f.input :is_deleted
    end

    f.actions
  end

  show do |f|

    panel I18n.t("active_admin.details", model: User.model_name.human) do
      attributes_table_for f.user do
        row :icon
        row :full_name
        row :is_deleted
        row :created_at
        row :updated_at
      end
    end

    attributes_table do
      row :id
      row :email
      row :is_deleted
      row :created_at
      row :updated_at
    end

    active_admin_comments if active_admin_config.comments?
  end