http_proxyの設定があるとlocalstackの起動でエラーになる

localstack を起動するときに、環境変数 http_proxy (または HTTP_PROXY) が設定されている環境では、以下のように elasticsearch の起動チェックで、何度か WARNING:infra.py:Service “elasticsearch” not yet available, retrying… の警告が出た後、エラーで終了することがある。

WARNING:infra.py:Service "elasticsearch" not yet available, retrying...
ERROR:localstack.services.es.es_starter:Elasticsearch health check failed (retrying...): (以降略)

また、Docker on Mac でもデフォルトがsytsem proxyを参照するようになっているため、OSのネットワーク設定でプロキシが有効になっている場合でも、同様の問題が発生する。

WARNING:infra.pyc:Service "kinesis" not yet available, retrying...
ERROR:infra.pyc:Error checking state of local environment (after some retries): Traceback (most recent call last):
File "/opt/code/localstack/localstack/services/infra.py", line 285, in check_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'
Traceback (most recent call last):
File "bin/localstack", line 79, in <module>
infra.start_infra()
File "/opt/code/localstack/localstack/services/infra.py", line 359, in start_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'

これは、起動チェックでモックサーバに接続しに行くところがプロキシサーバ経由となり、モックサーバに接続できないことが原因である。
このような場合、プロキシサーバを使用しないように環境変数の設定を解除すればエラーは解消するはずである。あるいは、環境変数 no_proxy
no_proxy=<コンテナのhostname>,localhost,127.0.0.1,[::1]
のようにセットすれば、ヘルスチェックがプロキシをバイパスするようになる。

この問題は、#239で解決済みであり、リポジトリから最新版を落としてくるか、PR#244のパッチを適用することで解消する。

続きを読む

aws-sam-localだって!?これは試さざるを得ない!

2017-08-11にaws-sam-localのベータ版がリリースされました。
単に「早速試したで!」と言う記事を書いても良かったのですが、少し趣向を変えてサーバレス界隈の開発環境のこれまでの推移を語った上で、aws-sam-localの使ってみた感想もお話しようかと思います。

サーバレス開発環境の今昔

サーバレス自体がかなり最近になって生まれた風潮なので昔とか言うのも問題はあるかと思いますが、とにかくサーバレスなるものの開発環境について私にわかる範囲でお話しようと思います。誤りや不正確な点については編集リクエストやコメントを頂けると幸いです。

なお、サーバレスという言葉は一般的な名詞ですが、私がAWS上でしかサーバレスに触れていないため、AzureやGCPなどには触れず、もっぱらLambdaの話になってしまうことをあらかじめご了承ください。

Lambdaのデプロイは辛かった

Lambdaの基本的なデプロイ方法はZIPで固めてアップロードです。
直接ZIPをLambdaに送るか、あらかじめS3に置いておいてLambdaにはそのURLを教えるかといった選択肢はありましたが、手動でZIPに固めてAWSに送るという手順は不可避でした。なんかもうすでに辛い。

さらに言うとLambdaに送りつけられるのはLambdaで実行するコードだけ。性質上Lambdaは単体で使われることはほとんどなく、他のサービスと連携することがほとんどなのにその辺は自分で管理するしかありませんでした。辛い。

CloudFormationで管理することは可能でしたが、CloudFormationテンプレートを書くのがかなりダルいことと、CloudFormationの更新とZIPのアップロードを別途行う必要があって手順が煩雑化しやすいため、「もうええわ」と手動管理してることが多かったと思われます。

また、ローカル環境で実行するには一工夫必要でした。

颯爽登場!Serverlessフレームワーク

そんな時に颯爽と現れたのがServerlessフレームワークでした。
ServerlessフレームワークにおいてはLambdaファンクション及び関連するリソースを独自のyamlファイルで管理します。結局は一度CloudFormationテンプレートに変換されるのですが、CloudFormationテンプレートよりも単純な形式で記述できたのが流行った一因かと思います。また、sls deployコマンドでLambdaのコードのアップロードおCloudFormationスタックの更新を一括で行ってくれたため、デプロイの手順は従来よりもはるかに簡略化されたかと思われます。

Lambdaテストしづらい問題

デプロイに関する問題はServerlessフレームワークや、ほぼ同時期に現れたSAMによって改善されましたが、開発プロセスにおいて大きな課題がありました。

テストし辛ぇ…

上記の通りLambdaは性質上他のサービスと連携することが多いため、その辺をローカル環境でどうテストするかに多くの開発者が頭を抱えました。対策として

  1. モッククラスを作って、実際のサービスのような振る舞いをさせる
  2. プロダクションとは別のリージョンに環境を再現して、そこで実行する

といった方法がありましたが、それぞれ

  1. モッククラスの実装がすこぶるダルい 下手したらロジック本体より時間かかる
  2. クラウドにデプロイしないとテストできないため、時間がかかる

といったデメリットがありました。

LocalStackとaws-sam-local

サーバレス開発者の嘆きを聞いたAtlassianがローカル環境でAWSのサービスのエンドポイントを再現するなんとも素敵なツールを作り上げました。それがLocalStackです。
再現されているサービスの数が物足りなく感じられたり、サードパーティ製であることに一抹の不安を覚えたりする人もいるかと思いますが、これ以上を求めるなら自分で作るぐらいしかないのが現状かと思います。

そしてaws-sam-local。こちらはLocalStackと少し趣が異なります。LocalStackが連携するサービスのエンドポイントを再現して提供するのに対して、aws-sam-localは実行環境の提供という意味合いが強いです。そして重要なことはAWSの公式がサポートしているということです。公式がサポートしているということです。大事なことなので(ry
「実行するのはローカルでNode.jsなりPythonなりで動かせばええやん」と思いがちですが、ランタイムのバージョンなどを本番環境と確実に揃えられるのは大きな利点です。
まだベータ版が出たばっかなので今後に期待といったところでしょう

aws-sam-local触ってみた

それでは実際に触ってみましょう。
ちなみに当方環境は

  • OS: macOS Sierra 10.12.6
  • Docker for Mac: 17.06.0-ce-mac19

です。

事前準備とインストール

公式のInstallationの項目を読み進めますが、事前にDockerを使えるようにしておく必要があります。

Macだったら普通にDocker For Macをインストールしておけば問題ありません。
一方Windowsだと

スクリーンショット 2017-08-16 14.48.18.png

まさかのDocker Toolbox推奨。 Docker For Windowsェ…
そしてaws-sam-localのインストールですが、私は-gオプション排斥論者なのでローカルインストールします

npm install aws-sam-local

実装

今回はこちらを参考にAPIゲートウェイから呼び出すLambdaを実装します。
ほぼ丸パクリですが一部アレンジしてますのでソースものっけます。

template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM Local test
Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /resource/{resourceId}
            Method: put

ランタイムをnodejs6.10に変更してます。
新しく作る場合にわざわざ古いバージョンを使う必要もありませんので。

余談ですが、WebStormのCloudFormation用のプラグインは今の所SAMには対応してないのか、Type: AWS::Serverless::Functionのところにめっちゃ赤線を引かれます。

index.js
/**
 * Created by yuhomiki on 2017/08/16.
 */

"use strict";

const os = require("os");
console.log("Loading function");


const handler = (event, context, callback) => {
  return callback(null, {
    statusCode: 200,
    headers: { "x-custom-header" : "my custom header value" },
    body: "Hello " + event.body + os.EOL
  });
};

exports.handler = handler;

完全に書き方の趣味の問題です。
内容は参考ページのものと全く同じです。

package.json
{
  "name": "sam_test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "invoke-local": "sam local invoke HelloWorld -e event.json",
    "validate": "sam validate",
    "api-local": "sam local start-api"
  },
  "author": "Mic-U",
  "license": "MIT",
  "dependencies": {
    "aws-sam-local": "^0.1.0"
  }
}

aws-sam-localをローカルインストールしているので、package.jsonのscriptsに追記しています。

実行

それでは実行してみましょう

上記のpackage.jsonに記載した

  • invoke-local
  • validate
  • api-local

を実行していきます。

invoke-local

Lambdaファンクションをローカル環境で実行します。
Lambdaファンクションに渡すevent変数はワンライナーで定義することも可能ですが、あらかじめJSONファイルを作っといた方が取り回しがいいです。

json.event.json
{
  "body": "MIC"
}

実行結果はこんな感じ

スクリーンショット 2017-08-16 15.25.42.png

まず最初にdocker pullしてランタイムに応じたDockerイメージをダウンロードします。
その後はコンテナ内でLambdaファンクションを実行し、最後にcallbackに与えた引数を出力といった流れです。
ログの形式がすごくLambdaですね。あとタイムゾーンもUTCになっていますね。
メモリの使用量をローカルで確認できるのは嬉しいですね。

-dオプションをつけることでデバッグもできるようです。
公式のgithubにはご丁寧にVSCodeでデバッグしてる様子がgifで上げられてます。

validate

テンプレートファイルのチェックをします。
デフォルトではカレントディレクトリのtemplate.yamlファイルをチェックしますが、-tオプションで変更することが可能です。

失敗するとこんな感じに怒られます。

スクリーンショット 2017-08-16 15.33.47.png

成功した時は「Valid!」とだけ言ってきます。きっと必要以上に他人に関わりたくないタイプなのでしょう。

api-local

sam local start-apiコマンドはローカル環境にAPIサーバを立ち上げます。
ホットリロード機能がついてるので、立ち上げっぱなしでもソースを修正したら自動で反映されます。いい感じですね。

スクリーンショット 2017-08-16 15.40.58.png

立ち上がるとこんなメッセージが出るので、あとはCURLなりPostManなりで煮るなり焼くなり好きにしましょう。

CURLの結果はこんな感じ
スクリーンショット 2017-08-16 15.51.39.png

所感

Lambdaのローカル実行環境を公式が用意したことに大きな意義があるかと思います。
Dockerさえあればすぐに使えることと、SAMテンプレートを書かざるをえないのでInfrastructure as Codeが自然と根付いていくのも個人的には好感を持てます。

ただし、まだベータ版なこともあって機能的にもの足りない部分があるのも事実です。
具体的にはやはりDynamoDBとかもテンプレートから読み取ってDockerコンテナで用意してくれたらなーと思います。LocalStackやDynamoDB Localでできないこともないでしょうが、DynamoDB Localに関してはテンプレートからテーブル作ったりするの多分無理なのでマイグレーション用のコードを書くことになりますし、LocalStackに関しては実はあまり真面目に使ったことないのでわかりませんが環境構築に一手間かかりそう。ていうかできれば一つのツールで完結させたい。

SAMしかりaws-sam-localしかり、AWS側としてもより開発がしやすくなるような環境づくりをしていくような姿勢を見せているので、今後のアップデートに期待したいところですね。

続きを読む

EC2インスタンスの情報をインスタンス内部から取得する

EC2インスタンスのメタデータを取得

取得できるメタデータの一覧を表示する

$ curl -s http://169.254.169.254/latest/meta-data/   #最後の/を忘れないこと
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/

使い方の例

AZを取得する

$ curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/
ap-northeast-1a

参考資料

インスタンスメタデータとユーザーデータ

続きを読む

localstackをdockerを使ってセットアップする

AWSを使って開発するときに、開発環境はローカルに配置して気軽に実行したいので、LocalStackを構築してみました。起動方法はいくつかるようですが、すでにデータベースなどをdockerで立ち上げているので、dockerを使ってLocalStackを動かします。

インストール

ドキュメントにはgitのリポジトリをローカルにcloneするように書いてありますが、リポジトリ全体が必要はなく、docker-compose.ymlさえあればいいので、それをローカルにコピーします。本当に必要なのは、そのファイルの中のservicesのlocalstackのところだけですね。

起動

docker-compose up -d

で起動します。Macの場合は

TMPDIR=/private$TMPDIR docker-compose up -d

とします。

AWSのコマンドのインストール

ついでにawsのコマンドをインストールします。pyenvとpyenv-vertialenvがインストールされている前提で話します。

pyenv virtualenv 3.6.2 aws
pyenv shell aws

次にawsの設定を行います。

aws configure

これで4つの情報を聞いてくるので、こんな感じで入力します。

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: json

これを設定しておかないと動かないので、適当に入力しておけばいいみたいです。

動作確認

あとは、「LocalStackをつかってローカルでLambdaを実行してみた」に書いてあるように、Lambdaを動かして動作確認します。

おわり

これで動作確認が終わりです。でも、ダッシュボードが8080のポートを使っていますが、dockerのイメージをそのまま使っている限りだと、このポートを変更することはできないようです。自分の開発中のものが8080を使っていると悲しいですね。

続きを読む

localstack を Docker on Mac 上で動かす

Docker on Mac のインストール

https://docs.docker.com/docker-for-mac/install/ から入手できます。
このドキュメントにしたがって、インストールします。

localstack パッケージの更新

pip でインストールしたパッケージは少し前まで、docker イメージが atlassianlabs/localstack になっていましたが、最近になって localstack/localstack に変更されています。

localstack パッケージは 最新版に更新しておいた方がよいでしょう。

pip install -U localstack

localstack を Docker on Mac 上で起動

Docker on Mac が動くようになったら、localstack--docker オプションをつけて起動します。
このとき、Docker for Mac の設定の Proxies のところで No proxy を選択して、プロキシを使用にないようにしておくことを推奨します。

$ localstack start --docker

docker イメージを自動的にダウンロードして、コンテナが起動されます。

Ready. が表示されれば、ローカル起動と同じように使用できます。

docker run で起動していますので、Ctrl-P Ctrl-Q でデタッチできます。

停止するときは、docker ps -a でコンテナIDを確認して、

docker stop コンテナID

で停止します。

再開するときは、

docker restart コンテナID

です。

localstack start --docker を実行すると、もうひとつ新しいコンテナを作ってしまいます。

WARNING:infra.pyc:Service "kinesis" not yet available, retrying... のあとエラーになる場合

Docker コンテナで起動したとき、次のようなエラーが出ることがあります。

WARNING:infra.pyc:Service "kinesis" not yet available, retrying...
ERROR:infra.pyc:Error checking state of local environment (after some retries): Traceback (most recent call last):
File "/opt/code/localstack/localstack/services/infra.py", line 285, in check_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'
Traceback (most recent call last):
File "bin/localstack", line 79, in <module>
infra.start_infra()
File "/opt/code/localstack/localstack/services/infra.py", line 359, in start_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'

このようなときは Docker for Mac の設定の Proxies のところで No proxy を選択して、プロキシを使用にないようにしてみてください。

プロキシを使う設定なっていると、Docker 内で起動した localstack がモックサーバの起動チェックをするときに、プロキシ経由でアクセスして、チェックに失敗することがあります。

続きを読む

AWSCLIインストール手順

はじめに

AWSCLIを使う際にエラーがやたらに出て、詰まったのでメモ。

環境

  • Mac OS Sierra

AWS CLIのインストール


Pythonのパッケージ管理ツールを経由してawscliを入れるためPythonをインストールする。

$ brew install python

$ sudo easy_install pip

$ sudo pip install awscli

// 上記の方法で出来なかった方は以下
$ sudo pip install awscli --upgrade --ignore-installed six

AWS CLIの設定


// AWSの設定を行う
$ aws configure

上記コマンドを入力後、AWSのアクセスキーとシークレットキーを入力あとは省略してもOKです。

pemファイルの権限

sshで接続する際に、pemファイルの権限がないと怒られたので、同様の方は以下

$ chmod 600 hoge.pem

hoge.pemは任意で変更し、pemファイルまでのパスを記述すればOK

以上で完了です。

続きを読む

[AWS] Point-to-Site VPN接続 (powered by VyOS)

Abstract

  • 「Windows10/Android等のVPN接続標準機能を使って、AWSにリモートアクセスVPN接続をしたい」という話です。
  • 今回はAWS側のVPNサーバとして「VyOS」を採用。
  • あらかじめ申し上げておきます。この方式はまだ成功しておりません世界中の方々が悩んでいる模様。
  • Windows7のレジストリ変更Microsoftサイトも効かず(ただ、これは別の方式(近日公開)で絶大な効果をもたらす!!)
  • ひとつトリッキーなソリューションがあるが、まだ未トライ(グローバルIPをプライベートIPのように使う(?)点がグレーに見える)
  • なんとなく、「Double NAT」というルート原因が立ちはだかっていそう…
  • また、VyOSは「異なるユーザによる同時VPN接続ができない」説があり、Point-to-Site VPNとしては、小生はOpenVPNやWindowsVPNやSoftEtherを推奨する次第。(小生はやったことないですが、strongSwanも候補?)
  • もの凄い猛者様は、CentOS上にL2TPを組み上げてしまうみたいです。

ここまでやって、詰んでいます。。。

この辺り:

を参考にさせていただきつつ、下記の設定をしましたが、成功しておりません…

configure
set system time-zone Asia/Tokyo

set interfaces ethernet eth0 address '10.0.11.250/24'
set interfaces ethernet eth1 address '10.0.12.250/24'

set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec nat-traversal enable
set vpn ipsec nat-networks allowed-network 0.0.0.0/0

set vpn l2tp remote-access outside-address 10.0.11.250 # Elastic IPアドレスも試してみた
set vpn l2tp remote-access outside-nexthop 0.0.0.0
(delete vpn l2tp remote-access outside-nexthop)

set vpn l2tp remote-access client-ip-pool start 192.168.110.1
set vpn l2tp remote-access client-ip-pool stop 192.168.110.100
set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret
set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret XXXXXXXX
set vpn l2tp remote-access authentication mode local
set vpn l2tp remote-access authentication local-users username XXXXXXXX password XXXXXXXX

set nat source rule 110 outbound-interface 'eth0'
set nat source rule 110 source address '192.168.110.0/24'
set nat source rule 110 translation address masquerade
(delete nat source rule 110)

こんなエラーが発生中

どうやっても、VyOSサーバから下記のエラーが消し去れません…

messages
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [01528bbbc00696121849ab9a1c5b2a5100000001]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: received Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000009]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: received Vendor ID payload [RFC 3947]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [FRAGMENTATION]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [MS-Negotiation Discovery Capable]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [Vid-Initial-Contact]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [IKE CGA version 1]
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: responding to Main Mode from unknown peer XXX.XXX.XXX.XXX
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: Oakley Transform [AES_CBC (256), HMAC_SHA1, ECP_384] refused due to strict flag
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: Oakley Transform [AES_CBC (128), HMAC_SHA1, ECP_256] refused due to strict flag
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: Oakley Transform [AES_CBC (256), HMAC_SHA1, MODP_2048] refused due to strict flag
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: Oakley Transform [3DES_CBC (192), HMAC_SHA1, MODP_2048] refused due to strict flag
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: NAT-Traversal: Result using RFC 3947: both are NATed
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[107] XXX.XXX.XXX.XXX #66: Peer ID is ID_IPV4_ADDR: 'ZZZ.ZZZ.ZZZ.ZZZ'
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX #66: deleting connection "remote-access-mac-zzz" instance with peer XXX.XXX.XXX.XXX {isakmp=#0/ipsec=#0}
MMM DD HH:MM:45 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sent MR3, ISAKMP SA established
MMM DD HH:MM:46 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: cannot respond to IPsec SA request because no connection is known for GGG.GGG.GGG.GGG/32===YYY.YYY.YYY.YYY:4500[YYY.YYY.YYY.YYY]:17/1701...XXX.XXX.XXX.XXX:4500[ZZZ.ZZZ.ZZZ.ZZZ]:17/%any===ZZZ.ZZZ.ZZZ.ZZZ/32
MMM DD HH:MM:46 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_ID_INFORMATION to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:47 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
MMM DD HH:MM:47 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_MESSAGE_ID to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:48 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
MMM DD HH:MM:48 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_MESSAGE_ID to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:51 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
MMM DD HH:MM:51 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_MESSAGE_ID to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:58 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
MMM DD HH:MM:58 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_MESSAGE_ID to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:13 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
MMM DD HH:MM:13 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_MESSAGE_ID to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:28 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
MMM DD HH:MM:28 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: sending encrypted notification INVALID_MESSAGE_ID to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500 #66: received Delete SA payload: deleting ISAKMP State #66
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[108] XXX.XXX.XXX.XXX:4500: deleting connection "remote-access-mac-zzz" instance with peer XXX.XXX.XXX.XXX {isakmp=#0/ipsec=#0}
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [01528bbbc00696121849ab9a1c5b2a5100000001]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: received Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000009]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: received Vendor ID payload [RFC 3947]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [FRAGMENTATION]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [MS-Negotiation Discovery Capable]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [Vid-Initial-Contact]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: packet from XXX.XXX.XXX.XXX:500: ignoring Vendor ID payload [IKE CGA version 1]
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: responding to Main Mode from unknown peer XXX.XXX.XXX.XXX
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: Oakley Transform [AES_CBC (256), HMAC_SHA1, ECP_384] refused due to strict flag
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: Oakley Transform [AES_CBC (128), HMAC_SHA1, ECP_256] refused due to strict flag
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: Oakley Transform [AES_CBC (256), HMAC_SHA1, MODP_2048] refused due to strict flag
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: Oakley Transform [3DES_CBC (192), HMAC_SHA1, MODP_2048] refused due to strict flag
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: NAT-Traversal: Result using RFC 3947: both are NATed
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[109] XXX.XXX.XXX.XXX #67: Peer ID is ID_IPV4_ADDR: 'ZZZ.ZZZ.ZZZ.ZZZ'
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[110] XXX.XXX.XXX.XXX #67: deleting connection "remote-access-mac-zzz" instance with peer XXX.XXX.XXX.XXX {isakmp=#0/ipsec=#0}
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[110] XXX.XXX.XXX.XXX:4500 #67: sent MR3, ISAKMP SA established
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[110] XXX.XXX.XXX.XXX:4500 #67: cannot respond to IPsec SA request because no connection is known for GGG.GGG.GGG.GGG/32===YYY.YYY.YYY.YYY:4500[YYY.YYY.YYY.YYY]:17/1701...XXX.XXX.XXX.XXX:4500[ZZZ.ZZZ.ZZZ.ZZZ]:17/%any===ZZZ.ZZZ.ZZZ.ZZZ/32
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[110] XXX.XXX.XXX.XXX:4500 #67: sending encrypted notification INVALID_ID_INFORMATION to XXX.XXX.XXX.XXX:4500
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[110] XXX.XXX.XXX.XXX:4500 #67: received Delete SA payload: deleting ISAKMP State #67
MMM DD HH:MM:43 VyOS-AMI pluto[3082]: "remote-access-mac-zzz"[110] XXX.XXX.XXX.XXX:4500: deleting connection "remote-access-mac-zzz" instance with peer XXX.XXX.XXX.XXX {isakmp=#0/ipsec=#0}

一旦、Step back…また戻ってくる日は来るか???
(戻ってきたときのための、備忘録★)

続きを読む

[localstack] ローカル環境にAWSサービスのモックを作り開発をする

AtlassianのLocalStackを使ってみてなんとなく理解するまでのお話 の通りなのですが本家のgithubを見るとこんな感じになってたので現行どうするかを備忘録としてメモします。

 
 スクリーンショット 2017-08-02 16.33.49.png

Atrasian/localstack -> localstack/localstack に変更になってます。

前提

  • Mac(macOS Sierra)
  • Docker Commnity Edition (Version: 7.06.0-ce-mac19)

  • dockerコマンドがコンソール上で実行可能であること

  • AWS CLIの設定が完了していること

イメージの準備

pull
docker pull localstack/localstack

起動

run
docker run -it -p 4567-4582:4567-4582 -p 8080:8080 localstack/localstack

起動させたらコンソールは放置

確認

ブラウザを立ち上げ

http://localhost:8080/

へアクセス

こんな画面が立ち上がってれば安心して大丈夫

エンドポイント

githubから転記してきましたが、変わってる可能性があるので必ず本家で確認して下さい。
https://github.com/localstack/localstack

サービス名 エンドポイントURL
API Gateway http://localhost:4567
Kinesis http://localhost:4568
DynamoDB http://localhost:4569
DynamoDB Streams http://localhost:4570
Elasticsearch http://localhost:4571
S3 http://localhost:4572
Firehose http://localhost:4573
Lambda http://localhost:4574
SNS http://localhost:4575
SQS http://localhost:4576
Redshift http://localhost:4577
ES (Elasticsearch Service) http://localhost:4578
SES http://localhost:4579
Route53 http://localhost:4580
CloudFormation http://localhost:4581
CloudWatch http://localhost:4582

AWS CLI

CLIコマンドを発行する場合
--endpoint-url で上記のエンドポイントを指定して使用します。
デフォルトのリージョンをconfigで指定していない場合、コマンドで--region を指定する必要があります。

サンプル(SQS)
aws sqs create-queue 
        --queue-name 'SAMPLE' 
        --region ap-northeast-1 
        --endpoint-url http://localhost:4576 
        --profile $myProfile

SDK(nodejs)

サンプル
'use strict';

const AWS = require('aws-sdk');
const endPoint = new AWS.Endpoint('http://localhost:4578');
const region = 'ap-northeast-1';
const s3 = new AWS.S3({ endpoint: endPoint, region: region });

基本的にはエンドポイントに上記URLを指定するだけでAPIをリクエストすることが出来ます。
ElasticSerchはすでに使用可能な状態のElasticSerchが動いています。ESの方はドメイン作成とかのAPI用のモックって感じですね。
開発の際に特にデータ系は何かレスポンスが必要なので地味に使えるツールですね

続きを読む

MacでLocalStackが動かないので応急処置して動かした話

MacでLocalStackを動かそうとしましたが、動作しなかったため応急処置をしました。
python3系、python2系双方を検証しました。(dockerでの挙動は未検証です)

なお、以下の内容では、LocalStackのelasticsearchが利用できない可能性があります。

目次

  • 環境
  • python3系
    • とりあえずやってみた
    • 先人の知恵を借りてみた
    • なんとかうごいた
  • python2系
    • とりあえずやってみた
    • elasticsearchを無効化してみた
  • 最後に

環境

OSはmacOS 10.12.5を利用し、pyenvが利用できる状態で環境構築を開始しました。

python3系

とりあえずやってみた

以下のようにインストール及び起動を行ったところ、zipimport.zipimporterに’path’という属性は無いよというエラーが発生しました。

$ pyenv install miniconda3-latest
$ pyenv global miniconda3-latest
$ pip install localstack
Starting local dev environment. CTRL-C to quit.
Error starting infrastructure: 'zipimport.zipimporter' object has no attribute 'path'
Traceback (most recent call last):
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/bin/localstack", line 86, in <module>
    infra.start_infra()
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/infra.py", line 362, in start_infra
    raise e
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/infra.py", line 306, in start_infra
    load_plugins()
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/infra.py", line 100, in load_plugins
    file_path = '%s/%s/plugins.py' % (module[0].path, module[1])
AttributeError: 'zipimport.zipimporter' object has no attribute 'path'

先人の知恵を借りてみた

以下の記事で同様の事象が起きていたので、こちらを参考に、infra.pyを編集しました。
http://qiita.com/komeda-shinji/items/88e493601b9827de51da

しかしながら、以下のようなエラーが発生しました。(nodeで発生したエラーは整形しています)

$ vi /Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/infra.py
$ localstack start
Starting local dev environment. CTRL-C to quit.
ERROR: cd "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack" && npm install': b'npm WARN deprecated node-uuid@1.4.8: Use uuid module instead

> leveldown@1.6.0 install /Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/node_modules/leveldown
> prebuild-install || node-gyp rebuild

prebuild-install info begin Prebuild-install version 2.2.1
prebuild-install info looking for local prebuild @ prebuilds/leveldown-v1.6.0-node-v57-darwin-x64.tar.gz
prebuild-install info looking for cached prebuild @ /Users/nogamincho/.npm/_prebuilds/https-github.com-level-leveldown-releases-download-v1.6.0-leveldown-v1.6.0-node-v57-darwin-x64.tar.gz
prebuild-install http request GET https://github.com/level/leveldown/releases/download/v1.6.0/leveldown-v1.6.0-node-v57-darwin-x64.tar.gz
prebuild-install http 404 https://github.com/level/leveldown/releases/download/v1.6.0/leveldown-v1.6.0-node-v57-darwin-x64.tar.gz
prebuild-install WARN install No prebuilt binaries found (target=8.2.1 runtime=node arch=x64 platform=darwin)
gyp ERR! configure error 
gyp ERR! stack Error: Command failed: /Users/nogamincho/.pyenv/shims/python2 -c import platform; print(platform.python_version());
gyp ERR! stack pyenv: python2: command not found
gyp ERR! stack 
gyp ERR! stack The `python2' command exists in these Python versions:
gyp ERR! stack   anaconda2-4.3.1
gyp ERR! stack   miniconda2-latest
gyp ERR! stack 
gyp ERR! stack 
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:270:12)
gyp ERR! stack     at emitTwo (events.js:125:13)
gyp ERR! stack     at ChildProcess.emit (events.js:213:7)
gyp ERR! stack     at maybeClose (internal/child_process.js:921:16)
gyp ERR! stack     at Socket.stream.socket.on (internal/child_process.js:348:11)
gyp ERR! stack     at emitOne (events.js:115:13)
gyp ERR! stack     at Socket.emit (events.js:210:7)
gyp ERR! stack     at Pipe._handle.close [as _onclose] (net.js:549:12)
gyp ERR! System Darwin 16.6.0
gyp ERR! command "/usr/local/Cellar/node/8.2.1/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/node_modules/leveldown
gyp ERR! node -v v8.2.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok 
npm WARN localstack@0.0.1 No repository field.
npm WARN localstack@0.0.1 No license field.

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! leveldown@1.6.0 install: `prebuild-install || node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the leveldown@1.6.0 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/nogamincho/.npm/_logs/2017-07-30T12_33_05_455Z-debug.log

Error starting infrastructure: Command 'cd "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack" && npm install' returned non-zero exit status 1.
Traceback (most recent call last):
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/bin/localstack", line 86, in <module>
    infra.start_infra()
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/infra.py", line 363, in start_infra
    raise e
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/infra.py", line 329, in start_infra
    install.install_components(apis)
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/install.py", line 155, in install_components
    parallelize(install_component, names)
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/utils/common.py", line 618, in parallelize
    result = pool.map(func, list)
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/multiprocessing/pool.py", line 260, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/multiprocessing/pool.py", line 608, in get
    raise self._value
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/multiprocessing/pool.py", line 44, in mapstar
    return list(map(*args))
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/install.py", line 147, in install_component
    install_kinesalite()
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/services/install.py", line 73, in install_kinesalite
    run('cd "%s" && npm install' % ROOT_PATH)
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/utils/common.py", line 521, in run
    return do_run(cmd)
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/utils/common.py", line 518, in do_run
    raise e
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack/utils/common.py", line 503, in do_run
    output = subprocess.check_output(cmd, shell=True, stderr=stderr, env=env_dict, cwd=cwd)
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/subprocess.py", line 336, in check_output
    **kwargs).stdout
  File "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/subprocess.py", line 418, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'cd "/Users/nogamincho/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/localstack" && npm install' returned non-zero exit status 1.

なんとかうごいた

python2コマンドをインストールして再実行したところ、一応動作するようになりました。

$ pip install python2
$ localstack start
Starting local dev environment. CTRL-C to quit.
Starting mock ES service (http port 4578)...
Starting local Elasticsearch (http port 4571)...
Starting mock S3 (http port 4572)...
Starting mock SNS (http port 4575)...
Starting mock SQS (http port 4576)...
Starting mock SES (http port 4579)...
Starting mock API Gateway (http port 4567)...
Starting mock DynamoDB (http port 4569)...
Starting mock DynamoDB Streams service (http port 4570)...
Starting mock Firehose service (http port 4573)...
Starting mock Lambda service (http port 4574)...
Starting mock Kinesis (http port 4568)...
Starting mock Redshift (http port 4577)...
Starting mock Route53 (http port 4580)...
Starting mock CloudFormation (http port 4581)...
Starting mock CloudWatch (http port 4582)...
WARNING:infra.py:Service "elasticsearch" not yet available, retrying...
WARNING:infra.py:Service "elasticsearch" not yet available, retrying...
Ready.

$ aws --endpoint-url=http://localhost:4568 kinesis list-streams
{
    "StreamNames": []
}

ただし、elasticsearchが正常に動作していない・・・?(elasticsearchは利用していないので、詳細は未確認です)

python2系

python2系でならば問題なく動くのでは・・・?という思いから、

とりあえずやってみた

期待したものの、以下のissueで挙がっているようなエラーが発生しました。
https://github.com/localstack/localstack/issues/213

$ pyenv install miniconda2-latest
$ pyenv global miniconda2-latest
$ pip install localstack
$ localstack start
Starting local dev environment. CTRL-C to quit.
ERROR: 'cd /Users/nogamincho/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/localstack/infra && cp /var/folders/_g/2d7f12gj1fq8p666s8sv6_8c0000gn/T/localstack.es.zip es.zip && unzip -q es.zip && mv elasticsearch* elasticsearch && rm es.zip': [es.zip]
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of es.zip or
        es.zip.zip, and cannot find es.zip.ZIP, period.

Error starting infrastructure: Command 'cd /Users/nogamincho/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/localstack/infra && cp /var/folders/_g/2d7f12gj1fq8p666s8sv6_8c0000gn/T/localstack.es.zip es.zip && unzip -q es.zip && mv elasticsearch* elasticsearch && rm es.zip' returned non-zero exit status 9
Traceback (most recent call last):
  File "/Users/nogamincho/.pyenv/versions/miniconda2-latest/bin/localstack", line 86, in <module>
    infra.start_infra()
  File "/Users/nogamincho/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/localstack/services/infra.py", line 362, in start_infra
    raise e
subprocess32.CalledProcessError: Command 'cd /Users/nogamincho/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/localstack/infra && cp /var/folders/_g/2d7f12gj1fq8p666s8sv6_8c0000gn/T/localstack.es.zip es.zip && unzip -q es.zip && mv elasticsearch* elasticsearch && rm es.zip' returned non-zero exit status 9

elasticsearchを無効化してみた

私はelasticsearchを利用する必要がなかったため、力技でelasticsearchを無効化しました。

vi /Users/nogamincho/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/localstack/plugins.py

以下の用にlocalstackの起動時に登録するサービスから、elasticsearchを除外しました。

def register_localstack_plugins():
    try:
#        register_plugin(Plugin('es',
#            start=start_elasticsearch_service))
#        register_plugin(Plugin('elasticsearch',
#            start=es_starter.start_elasticsearch,
#            check=es_starter.check_elasticsearch))                                                                                          
        register_plugin(Plugin('s3',
           start=start_s3,
           check=s3_starter.check_s3,
           listener=s3_listener.update_s3))

localstackを起動したところ、elasticsearchのサービスは起動せず、エラーが発生しなくなりました。

$ localstack start
Starting local dev environment. CTRL-C to quit.
Starting mock API Gateway (http port 4567)...
Starting mock CloudWatch (http port 4582)...
Starting mock SES (http port 4579)...
Starting mock Kinesis (http port 4568)...
Starting mock Redshift (http port 4577)...
Starting mock S3 (http port 4572)...
Starting mock CloudFormation (http port 4581)...
Starting mock DynamoDB (http port 4569)...
Starting mock SQS (http port 4576)...
Starting mock SNS (http port 4575)...
Starting mock DynamoDB Streams service (http port 4570)...
Starting mock Firehose service (http port 4573)...
Starting mock Route53 (http port 4580)...
Starting mock Lambda service (http port 4574)...
Ready.

$ aws --endpoint-url=http://localhost:4568 kinesis list-streams
{
    "StreamNames": []
}

最後に

python3系2系ともに力技で動作させました。
なお、執筆時点(2017/7/30)の情報ですので、最新のbug fixの情報をチェックすることをおすすめします。

最後に補足ですが、バージョンを0.7.2, 0.7.1, 0.6.1.1と落としてみても同様の事象が発生しました。
これはMac側の問題ですかね・・・?

続きを読む