プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

リモートアクセスVPN を QNAP 上で動かす

今まで、こちらの記事にあるように、 SoftEther を利用して自宅LANへのリモートアクセスを実現していました。

しかし、SoftEtherVPN の Server を動かすために動かしていたマシンを廃棄したくなってきたため、これを QNAP 上に移動できないか検討したので、その際のメモをまとめておきます。

QNAP の機種は下記の TS-251+ を使ってます。

www.qnap.com

SoftEther VPN Server 立ち上げ

QNAP TS-251+ だと、 Virtualization Station と Container Station があり、仮想マシンとdockerコンテナを動かすことができます。 dockerコンテナで動かしたいなと思ったのですが、NIC周りでトラブルのが嫌だったので、とりあえずは Virtualization Station (KVM) 上で仮想マシンを立ち上げ、そちらで動かしてみました。

OS は、 Ubuntu 16.04.2 (64bit, サーバー)としました。 SoftEther VPN Server は現時点の最新版を使います(Ver 4.20, Build 9608, rtm)。ダウンロードページはこちらになります。

インストール手順としては、ほぼこちらの記事と変わりないのですが、若干違いがあったところだけ、追記しておきます。

起動方法

Ubuntu は 16.04 からスタートアップ処理が SysVinit から systemd に変更になったそうです。 これに伴い、 /etc/init.d にスタートアップスクリプトを書くスタイルから、 /etc/systemd/system に起動用設定ファイルを書くスタイルになったそうです。

で、ネットを探すと、そのものずばりのサイトがありました。

Systemd用SoftEther設定ファイル - blog.204504byse.info

qiita.com

実際に作成したスクリプトは下記になります。

[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

リンク先サイトまんまですね。 これを、 /etc/systemd/system/vpnserver.service として保存しておきます。

OS再起動後、vpnserverプロセスが立ち上がっていたらOKです。

(参考)

systemd 一般の話のリンクも載せておきます。

eng-entrance.com

qiita.com

qiita.com

NIC の追加とプロミスキャスモード

SoftEther VPN Server を使って、リモートアクセスを可能にするためには、ローカルブリッジを作る必要があります。

以前の環境だと、 ESXi 上で動かしていたため、ポートグループを作成して、そちらでプロミスキャスモードを設定するという方法を取っていました。 詳しい手順などは、下記を参考にしてください。

blog.mori-soft.com

QNAPの場合、仮想スイッチがあり、物理NICと仮想マシン上の(仮想)NICがこの仮想スイッチを経由して接続されているようです。 でも、仮想スイッチの設定に『プロミスキャスモード』みたいなものがありません。

どう設定すればいいのだろうか? と思って、あれこれ調べたのですが、これといった決め手が見つかりませんでした。

ただ、仮想スイッチは大きく3つの動作モードを持っているようで、仮想マシンと物理NICを直接つなげるような使い方でできるようです(外部専用ネットワーク)。

www.qnap.com

これを使えば、実現できそうな気がします。

ということで、とりあえず、今回は下記のように対応することにしました。

  • 外部専用ネットワークの仮想スイッチを作成する
  • TS-251+ の物理NICが1つ余っているので、これを作成した仮想スイッチにつなげる
  • 仮想マシンに(仮想)NICを追加し、この仮想スイッチに接続する
  • OS側の設定で、追加した仮想NICに対して、IPアドレスを 0.0.0.0 として設定する

外部専用ネットワークの仮想スイッチは、仮想スイッチの作成画面で、

f:id:junichim:20170710161302p:plain

『IPアドレスを割り当てない』を選択すると作れるようです。

設定後の TS-251+ のネットワークの設定画面をみると、こんな感じになります。

f:id:junichim:20170710160613p:plain

ちょっとわかりにくいですが、下側の Virtual Switch 4 というのが外部専用ネットワークで作成した仮想スイッチで、ここにつながっている仮想NICが上記で追加したものです。

/etc/network/interfaces の設定内容はこんな感じです。

mor@ubuntu-vpn:/etc/network$ cat interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens3
iface ens3 inet dhcp

# nic for SoftEther VPN Server
# added by Junichi MORI
# 2017/7/9
auto ens4
iface ens4 inet static
address 0.0.0.0

mor@ubuntu-vpn:/etc/network$ 

ens3 が一つ目のNIC、ens4が追加した二つ目のNICになります。

ちなみに、今回は起動時に rc.local とかで ifconfig ens4 promisc としていないのですが、ifconfig で設定内容を表示させると、ens4 に対して PROMISC が表示されていました。 以前セットアップした際は必要かと思っていたのですが、必要ないのかな? Ubuntu 16.04 だからなのか、Linuxは一般にこうなるのか、IPアドレスが 0.0.0.0 だからなのかまでは、ちょっとわからなかったです。

(参考)nicのデバイス名

Ubuntu 15.10 からnicのデバイス名の命名方法が変わっているようです。 eth0 や eth1 じゃなくて、 ens3 や ens4 となっています。

CentOS7 の記事ですが、命名規則がわかりやすかったです。

www.atmarkit.co.jp

お気を付けください。

その他

以前の方法だと、SoftEther VPN Server の設定として VPN Azure を使っていたのですが、結構おもい印象でした(いろんな要因があるので、これだけではないとは思います)。

今回はVPN Azure のよくある質問ページにも書いてある NATトラバーサル(NAT-T, 一般的には UDP ホールパンチング)を使うように変更しました。

とはいっても、クライアントとして SoftEther VPN Client を使えば接続時に自動的に試してくれるので、特別な設定は必要ないです。

SoftEther VPN Client の設定

NAT-Tを使うため、クライアント側では、 Softether VPN Client を使う必要があります。

Windows の場合

下記の手順に従って、インストール、設定をすれば完了です。

8.2 Windows へのインストールと初期設定 - SoftEther VPN プロジェクト

初回起動時に仮想LANカードが作成されます。接続設定として

  • VPN サーバー名(DDNS名)
  • ポート番号
  • VPN接続ユーザー名とパスワード

を入力すればOKです。

特に設定が間違っていなければ、これで接続できるはずです。

Linux の場合

SoftEther VPN Client はLinux版もあります。設定用のGUIツールがないので、やることはWindows版と同じですが、vpncmd で設定することになります。 設定時に使う主なコマンドとしては

  • NicCreate, 仮想LANカードの作成
  • AccountCreate, 新規接続設定の開始
  • AccountPasswordSet, 認証情報の設定

  • AccountConnect 接続

  • AccountStatusGet 接続状態の確認
  • AccountDisconnect 切断

かと思います。必要に応じてhelpコマンドで調べてください。

また、上記設定だけだと、VPN接続が成功しても、仮想LANカードにIPアドレスが割り当てられません。 なので、仮想LANカードがDHCPからアドレスを取得できるように /etc/network/interfaces に設定を書いておきます。

例えばこんな感じです。

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

allow-hotplug vpn_vpn0
iface vpn_vpn0 inet dhcp

ここでは仮想LANカード名を vpn0 としました。

これで接続を試して、問題なく接続できれば、OKです。

おわりに

これで問題なく QNAP 上で運用できるようになると、今まで使っていた古いサーバーを処分できるので、部屋が少しは涼しくなりそうです。 当面は問題が起こらないか様子見ですね。

あと、Linux 上で VPN Server を動かす場合 tap デバイスを使うのが定番のような印象を受けています。おいおい、このあたりも調べて試してみようと思います。

map フォーマットファイルを自分で作成する方法について

Androidアプリ『避難所検索@伊勢』では、オフラインマップを使っています。 このオフラインマップでは、 Mapsforge というライブラリを利用して地図を表示しており、 Mapsforge では OpenStreetMap のデータを map フォーマットというファイル形式で読み込み・表示します。

map フォーマットのファイルは、

Mapsforge Download Server

このサイトからダウンロードできます。明記はされていませんが、定期的に更新しているようです。

ただ、こちらのサイトの map ファイルは国または都市単位で、残念ながら日本は国単位でしかないので、サイズが非常に大きくなっています(japan.map で約 800MB!)。

スマホのストレージはそんなに潤沢じゃないので、これだと、アプリに同梱するにせよ、オンライン時にダウンロードするにせよ、扱いが難しくなってきます。

そこで、『避難所検索@伊勢』では、伊勢市近辺のみのオフライン地図データを作成して、それをアプリに同梱しています。

ここでは、メモがてら、オフラインマップファイルの作成の際にやったことをまとめておきます。

Webサービス

最初にWebサービスで任意の範囲の mapファイルをダウンロードできるものがないか探しました。

すると、BBBike というサイトが OpenStreetMap のファイルのダウンロードサービス(正しくは抽出サービス、というのかな?)を提供してくれています。

extract.bbbike.org

このサービスでは、指定した範囲に含まれる OpenStreetmap のデータを抽出(ダウンロード)することができます。また、ダウンロードできるファイル形式には、.map を始め、 .pbf など多種多様なものがあります(.pbf というのが、標準的な OpenStreetMap データのバイナリ形式フォーマットのようです)。

ということで、このサイトにアクセスして、ファイル形式を指定して、抽出完了通知を受け取るメールアドレスを入力して、ダウンロードしたい範囲を指定します。

しばらくすると、入力したメールアドレス宛に、ダウンロード準備ができたよ、と通知が来るので、メールに記載のリンクをクリックして、データを落とします。 zipファイル形式になっているので、解凍すると、中にお目当ての.mapファイルがあります。

なお、BBBike の抽出サービスについての詳細は下記サイトなどをご参考にしてください。

Help | BBBike extracts

OpenStreetMapの地図情報からタイル画像を生成する - GiBlockラボ

(参考)BBBike について

あと、元々の BBBike というサイトは、サイトのトップページに

Welcome to BBBike, your cycle route planner! We’ll help you find a nice, safe and short bicycle route in your city and around. Please choose your city:

とあるように、自転車向けに最適なルートを提供するというサービスのサイトのようです。元々、ベルリンを対象に始まり、それが他の都市にも広がったもようです。 日本だと、東京ぐらいしか入ってないですね。伊勢も入れてくれないかなー。

実は

実はこれで問題ないかと思いきや、このファイルを使って mapsforge で表示させると、なんと、海が真っ白になってしまいます。

f:id:junichim:20170707221930p:plain

最初はよくわからなかったのですが、いろいろ調べてみると mapsforge のやり方として、海岸線のデータを個別に持ったりしているのではなく、レンダリング時に海をうまいこと描画しているようです(ちょっと中途半端な理解なんでこれ以上なんともいえないです)。

なので、海へ対応するためには、それなりの手順を踏む必要があり、そのことが mapsforge のサイトに記載されていました。下記ページにあるような手順が必要とのことです。

mapsforge/MapCreation.md at master · mapsforge/mapsforge · GitHub

また、この際に、map-writer というのを使って書き出すようです。

mapsforge/Getting-Started-Map-Writer.md at master · mapsforge/mapsforge · GitHub

『こんなややこしいのやるの嫌だなー』と思いつつ、もう少し調べると、既に mapsforge のサイトに答えがありました。 mapcreator というツールが用意されており、これを使うと、上記ページに記載されている手順を python スクリプトで自動的に実行してくれるようです。

github.com

ということで、この mapcreator を使ってみたので(わかる範囲で)使い方を書いておきます。

mapcreator

準備

mapcreator のページ(一番下あたり)見ると、いろいろと準備が必要とあります。 詳細な手順は覚えていないのですが、 Windows10 (64bit, Anniversary Update) 上の BoW (Ubuntu 14.04.5 相当)で環境構築した際には、以下のものをインストールしています。

mapcreator

git clone https://github.com/mapsforge/mapsforge-mapcreator.git

Osmosis

wget http://bretth.dev.openstreetmap.org/osmosis-build/osmosis-latest.tgz
mkdir osmosis
mv osmosis-latest.tgz osmosis
cd osmosis
tar xvfz osmosis-latest.tgz
rm osmosis-latest.tgz

map-writer, Osmosisのプラグインとして動作

mkdir ~/.openstreetmap/osmosis/plugins
cd ~/.openstreetmap/osmosis/plugins
wget http://search.maven.org/remotecontent?filepath=org/mapsforge/mapsforge-map-writer/0.8.0/mapsforge-map-writer-0.8.0-jar-with-dependencies.jar

Osmosisのプラグインとして設定するには、特定のディレクトリに配置すればよいようです。詳細は下記リンク先等を参考にしてください。

mapsforge/Getting-Started-Map-Writer.md at master · mapsforge/mapsforge · GitHub

Osmosis/Detailed Usage 0.45 - OpenStreetMap Wiki

GDAL, ダウンロードページのUbuntuを参照, こちらのページに行きついた

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ubuntugis/ppa

sudo apt-get install python-gdal
sudo apt-get install gdal-bin

Shapely

sudo apt-get install python-pip
sudo apt-get install python-software-properties
sudo apt-get install libgeos-c1v5
sudo pip install Shapely

その他(ヘッダファイルなど)

sudo apt-get install python-dev
sudo apt-get install libgeos-dev

設定ファイル

入力となる .pbf ファイルですが、 mapcreator のサイトには、地球全体の.pbfファイル(planet.osm に対応する.pbf)を使って試しなさい、とありますが、数十GBもあるので、とてもじゃないけど扱いたくありません。 なので、.pbfファイルは抽出したい領域より少し大きめにとったものを BBBike のサイトからダウンロードしておきます。

ちなみに、.pbf ファイルはBBBikeからダウンロードするほかに、 Geofabrik 社のダウンロードサイトからも取得することができます。こちらのデータは定期的に更新されており、国別・地域別に提供されています。日本だと、地方(関東や関西など)別に提供されています。ちなみに関西で、約130MBありましたので、こちらのデータを使う場合はデータサイズにお気を付けください。

次に設定ファイルを編集します。基本的には、mapcreatorのページに説明があるので、それに従います。 あれこれいうより、実際に設定したxmlファイルを示します。

ise_config.xml



    
    


このファイルの意図としては、伊勢市周辺のデータを抽出して、.mapファイル(のみ)を作成するというものです。設定方法によっては.pbfファイルも一緒に作成できるようですが、今回は使っていません。

上記のxmlファイル中にパスを指定するタグ(xml中の~pathのタグ)がいくつかありますが、それぞれの意味は次の通りのようです。

  • osmosis-path, インストールしたOsmosis のbinフォルダ中の osmosis ファイルを指定
  • map-staging-path, 作業途中でmapファイル保存に使うフォルダ
  • pbf-staging-path, .pbf ファイルを保存するフォルダ。またスクリプト動作時に自動的に土地データ(http://openstreetmapdata.com/data/land-polygons)をダウンロードおよび展開する際に使用するフォルダ
  • polygons-path, 設定ファイルの part タグの name 属性に対応するポリゴンデータを格納するフォルダ
  • map-target-path, 最終的に.mapファイルが出力されるフォルダ(map-staging-pathと同じだと実行時に、コピーできないと怒られます)
  • logging-path, ログフォルダ
  • initial-source-pbf, 処理対象となる.pbfファイル名

ここで、 polygons-path に格納するポリゴンデータ(ポリゴンファイル)ですが、このファイルに定義した範囲が抽出の対象となるようです。 今回は下記の様に矩形で定義しました。

ise.poly

polygon
1
   136.517   34.585
   136.928   34.585
   136.928   34.377
   136.517   34.377
   136.517   34.585
END
END

なお、抽出元の.pbfファイルは、地図の北を上側にして矩形の左下と右上を、(経度、緯度)で表すと

(136.517, 34.377) - (136.928, 34.585)

の範囲を対象としたものになっています。

また、設定ファイル(上記の例だと ise_config.xml)の part タグの map-start-lat, map-start-lon はこのポリゴンで指定される領域内を指す必要があるそうです。

なお、ポリゴンファイルは、設定ファイルの part タグの入れ子の階層およびname属性と対応している必要があるので、注意してください。まあ、mapcreatorをcloneした状態で、xml/example-config.xml ファイルをみれば大体想像がつくとおみます。

上記の例の場合は、polygons-pathフォルダの直下に ise.poly ファイルを配置しています。

実行

上記の設定ができれば、さっそく実行してみます。

python mapcreator.py -c xml/ise_config.xml

実行が始まると、土地データ(http://openstreetmapdata.com/data/land-polygons)のダウンロードが始まります。全世界のデータっぽくて、このときで約460MBのサイズがありました。 無事にダウンロードが終わると処理が行われていきます。ちなみに、このファイルのことを調べると、ここでも『ポリゴン』という用語が出てきますが、先ほどのmapcreatorの設定ファイルで出てきている polygons-path のポリゴンとは別のものを指していると思いますので、ご注意ください。

内部の処理は詳細に追いかけていませんが、ログファイルを見て、特にエラーが出力されていず、終了しており、mapファイルが作られていればOKなのかと思います。

出来上がった map ファイルをmapsforgeで表示すると、今回は正しく海が表示されました。

おわりに

範囲を狭くしたmapファイルを作ることがこんなに大変だと思いませんでした。ちょっとやられた感があります。

とはいえ、OpenStreetMap のデータをあれこれ調べ始めると、結構楽しそうだな、とも感じてます。 どっかで仕事に絡めて調べてみたいなー。

避難所検索@伊勢(β版) をリリースしました

はじめに

今年度の頭頃(2017年4月頃)だったかな?伊勢市がオープンデータライブラリを公開しました。

オープンデータが増えてくれると、開発側としてはいろいろとうれしいことが多いので、大いに応援しています(頑張れー!伊勢市さん)。 といっても、誰も使ってる・見てるよ、という反応がないと、市役所の方もきっと残念がるでしょうから、早速オープンデータを使った何かを作ることにしました。

というわけで、作ったものを紹介します。

作ったもの

最初に結論を先に書いときます。

作ったのは、Android用アプリ『避難所検索@伊勢』で、現在地の近くの避難所を検索して表示するアプリです。 災害時でも利用できるように、オフラインでの地図表示を行います。

f:id:junichim:20170707150102p:plain

こんな感じになります。

まだ、β版ですが、気になる方がいれば、 Google Play から試してみてください!

play.google.com

ここまでの経緯

さて、以下ではこれをリリースするまでの経緯について書いておきます。

何をするか?

伊勢市でオープンデータの整備が始まったのを受け、作るものをあれこれ検討しました。まず公開されているオープンデータ(検討したのは2017年4月頃)を見ながら、いろいろと考えてみました。

最初は、伊勢市内の町毎の人口のデータがあったので、人口の移り変わりを一時期はやっていたインフォグラフィック的に見せるのも面白そうだと考えました。 国を挙げて、少子化対策・人口減少と言ってますからね。

伊勢市のオープンデータライブラリのデータには、町名ごとの人口はあるのですが、位置情報がありません。そこで、国土交通省の位置参照情報を見てみました。

位置参照情報ダウンロードサービス

両者を突き合わせると、その町を代表する地点の緯度経度がわかるので、地図上に表示できそうです。

ということで、これでいけそうかなと思い、CartoDB (今は CARTO と呼ぶみたい)を使って、ちょっと取り組んでみました。 最終的に、わかったことは、意外と町ごとの違いが目立たないし、町を地図上の一点で表示させると面白くないし、かといって、町の境界を表す多角形を定義して・・・なんてやり始めたら、仕事の時間が無くなってしまうし、ということでした。

もし、また気が向いたら、アイデア練り直してみよう、ということで、サクッとやめました。

次のネタ

で、次に浮かんだのが、避難所データを利用するアプリです。ほぼ一年前のOSC名古屋2016でも、オープンデータの避難所データを使うアプリの話があったので、悪くない線だと思います(もっとも、自分も参加していたのですが)。 アプリの機能としては、災害時での利用を想定して、インターネットが使えない環境でも、現在位置に最も近い避難所を検索できるアプリ、というものです。

構成

最初は、Google Map + マイマップ機能 で十分代用できるんじゃないかと思ったのですが、調べてみると日本国内だとGoogle Map の地図はオフラインモードで使えないようです。実際、自分のスマホで試した時も使えませんでした。

ということで、OpenStreetMap を利用して地図表示を行うことにしました。

今回作るのは、Android版のみですので、地図表示は、 Mapsforge というライブラリを使います。 また、現在位置から近くの避難所を探す際は、直線距離だとあまり現実味がないので、経路検索をするために、 GraphHopper というライブラリを使います。 まさか、経路検索ライブラリもオープンソースで使えるとは思ってなかったので、ちょっと感激です。

オフライン地図データの更新や避難所データの更新をどうしようかという点も気になったのですが、まずは使ってくれる人がどれだけいるかわからないので、それらの点は後回しにしています。 実際に対応するなら、特定のURLをチェックして、更新版があればダウンロード、という形になるんだろうな、きっと。

ということで、取り急ぎ作成したものが上記のものになります。 あと、このアプリのソースは、GitHub で公開しました。興味がある方はどうぞご覧ください。実装がいけてない点も多々あると思いますが、その点はご勘弁ください。

github.com

ライセンスは Apache License 2.0 です。

あ、あと、技術的なことなどはおいおい(気が向いたら)ブログなり、Webサイトなりに書いてきたいと思います。

今後

オープンデータに限ったことではないのですが、この手の無料版アプリの難しいところは、作って公開するまでは開発者のモチベーションさえあればなんとかなるのですが、その後の維持管理が難しいところです。 実際、オフライン地図データをどうやって定期的に更新させるのか、メンテナンスはどうするか、など色々と気にはなってきています。 (自分を振り返ってみても、過去に作ったもので、その後放置になってるものもあるんですよね、実際)

そういうわけで、当面は(まだモチベーションが続きそうなんで)メンテナンスすると思いますが、先々のことはまたその時に考えたいと思います。

OpenStreetMap で地図を編集してみよう!

はじめに

先日のOSC名古屋2017 にて、 OpenStreetMap のセッションを聞いてきました。 で、このセッション中に、地図が自由に編集できますよ、という話がありました。 自由にというとちょっと語弊がありますね。OpenStreetMap は

OpenStreetMap(OSM)は、道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクトです。誰でも自由に参加して、誰でも自由に編集でき、誰でも自由に利用する事が出来ます。

OpenStreetMap 日本語サイト より引用

というもので、自分が知っている地域の情報が地図に反映されていない場合は、それを反映することができますよ、といったほうがいいかと思います。

ということで、 OpenStreetMap の地図を編集した話をメモしておきたいと思います。

ちなみに、OpenStreetMap なんて知らねーぜ、という方も多いかと思いますが、実は、Facebookの場所の地図表示はこの OpenStreetMap を使っています(地図のどこか下のほうかな?にクレジットがあります)。なので、知らず知らずのうちに使っていることも多いかもですよ。

アカウントの取得

地図を編集するなら、まずアカウントを取得する必要があります。 OpenStreetMapのページを開いて、『地図を編集』を押します。 アカウントを持っていなければ、『今すぐ登録』で登録します。 登録には、有効なメールアドレスとパスワード、表示名を入力します。

登録すると確認メールが来るので、問題なければメール中のリンクをクリックすればOKです。

チュートリアル

ログインすると、下記の様な画面が表示されます。

f:id:junichim:20170612165642p:plain

初めてなので、チュートリアルをやってみました。 チュートリアルでは、場所(ポイント)の指定方法、ライン(道路など)の指定方法、エリア(建物など)の指定方法、を教えてくれます。 いずれも、直感的な操作なので、すぐにわかる事かと思います。

ま、チュートリアルの詳細は紹介するよりも、実際にやってみてもらうほうがよくわかると思いますので、割愛します。

ただ、残念ながら、ポイントの説明までは日本語なのですが、エリアとラインの説明が英語でした。そんなに難しくないので、ポイントをやってみれば、エリアとラインのチュートリアルもなんなくこなせるかと思います。

地図を編集

さて、実際に地図を編集してみましょう。 OpenStreetMapにログインした状態だと、画面上部の『編集』ボタンをクリックすることでそのまま編集ができます。

f:id:junichim:20170612171150p:plain

編集画面では、上空からの画像(衛星写真?航空写真?)の上に、登録済みの地物(先ほどのポイント、ライン、エリア)が重ねて表示されています。

伊勢近辺の方ならわかりますが、上記の画像でも ダイムスタジアム伊勢(以前は、倉田山公園野球場)や最古の厄除観音で知られる松尾観音寺といった、超メジャーな場所ですらまだ登録されていません。 最初に登録すれば、登録者としての名前が一生(どころかOpeNStreetMapがある限りずっと)残るので、これは登録しない手はありません。

ということで、私が登録してしまいます。 登録すると、こんな感じです。

f:id:junichim:20170612173100p:plain

上空からの写真だと、伊勢市の消防本部・防災センターが建設中のようで、敷地がよくわからかったので、ポイントとして登録しています。 この状態だと、まだ正式に登録されていません。画面上部の『保存』ボタンを押すと、

f:id:junichim:20170612173620p:plain

のように、登録時の情報入力画面が表示されますので、適切なコメントを記入してから、『アップロード』を押します。 問題がなければ、データがアップロードされます。アップロード完了後、わりとすぐに反映されます(審査とかないので)。

f:id:junichim:20170612173959p:plain

これ、編集しだすと、『あ、ここの神社がない。よし、登録してしまえ。』とか『ここの川岸の形が違ってる。よし、なおしてやれ。』とか、簡単に編集できるので、結構くせになりそうです。

最後に

今回地図を編集してみようかな、と思い立ったきっかけは、OSM名古屋2017で聞いたのもあるのですが、たまたま自分の実家近辺を見たときに、近所の目印となるようなものが全くなかったためです。まあ、田舎だから仕方ないのですが、せっかくその場所に関する情報をもっていて、OpenStreetMapというものも知っているので、登録しない手はない、と思い立った次第です。

あと、普段は、OpenStreetMap を使ってばかりですが、一度昔々に地図作成ってどうなんだろうか?と思って、OpenStreetMap系の話を聞いたときは、(その時の話の主旨をよくわかってなかったのもあるかもしれませんが)GPSロガーが必要だったような印象を受けて、これは敷居高いな、と思った印象がありました。

でも、今回試して上空からの写真を元に、気軽に地図を編集できるので、これはやらない手はない、という印象でした。 登録したものが間違っていたらどうしよう、とかは気にせず、間違っていたら誰かが直してくれるはずなので、気にせずいきましょう。

少しでも、興味があれば、ぜひ試してみることをお勧めします。

ちなみに、上記の地図編集は、iDというエディタをブラウザ上で使った場合の地図編集となるようです。OpenStreetMapの地図編集は、これも上記の方法一通りというのではなく、JOSMという上級者向け(?)のツールなどもあるようです(こっちはまだ試せてません)。

地図編集するほどではない方に

あと、今回初めて知ったのですが、 OpenStreetMap の画面から、修正要望のようなメモを残す機能があります。

f:id:junichim:20170612174843p:plain

画面右端の列の吹き出しようなアイコンをクリックすると、

f:id:junichim:20170612232851p:plain

のようなメモ編集蘭が表示されます。

これは、自分で修正するほどではないけど、『こうしてほしい』、とか、『ここ間違ってるよ』いったような要望を伝えることができる機能のようです。 便利なのが、アカウントがなくてもメモを残すことができます。もちろん、アカウントでのログインがあれば、その人に紐づいたメモになります。

気になることがあるけど、地図を編集するほどではない、とか、アカウント作るのなんかいやだ、という場合、こういう機能を利用するのもありかと思います。

AWS CLI 複数の認証情報の設定について

以前、EC2のインスタンスを t1.micro から t2.nano へ移行する作業について書きました。

blog.mori-soft.com

この中で、S3 へバックアップを行うという設定を行っていたのですが、月一動作だったので、改めて動作確認をしてみると、どうもうまく動いていません。 こんな感じのエラーです。

2017-06-01 03:05:01 JST: aws s3 cp バックアップファイル名 s3://バケット名/
upload failed: バックアップファイル名 to s3://バケット名/ファイル名 An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

アクセス拒否のようです。

aws cli はいろんな方法で認証情報を指定できるので、これが間違っているのだろうと予想されます。 いろいろと調べてみると、 aws configure list で現在の認証情報の設定状況を確認できることがわかりました。

dev.classmethod.jp

早速、試してみると

bitnami@ip-172-30-0-73:~/.aws$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************aaaa shared-credentials-file    
    region                <not set>             None    None
bitnami@ip-172-30-0-73:~/.aws$ 

あれ?なんかおかしいぞ。

実は、aws cli を使う際、EC2 用のユーザーと S3 用のユーザーを分けていました。 で、上記のアクセスキーなどは、EC2ユーザーのものです。 おまけに、 region も設定されていない。

ということで、認証情報の設定方法を見直しました。

間違っていた点

恥ずかしならが、調べた結果、いろいろと間違っていました。まず現在設定していた方法は、

  • EC2 用のユーザーは aws configure コマンドで設定する
    • .aws/config と .aws/credentials に内容が書かれている
  • S3 用のユーザーは .aws/config.s3 ファイルにすべての内容を記述する
  • S3 用のユーザーを使う場合は、 環境変数で AWS_DEFAULT_CONFIG=.aws/config.s3 を指定する

というものでした。

で、まず大きく間違っていたのが、下記の説明にある、

docs.aws.amazon.com

この部分、

Storing Credentials in Config
The AWS CLI will also read credentials from the config file. If you want to keep all of your profile settings in a single file, you can. If there are ever credentials in both locations for a profile (say you used aws configure to update the profile’s keys), the keys in the credentials file will take precedence.

(頑張って意訳)

Config ファイルへの認証情報の保存について
AWS CLI は config ファイルから認証情報を読むこともできます。プロファイル設定のすべてを1ファイルに保存することも可能です。もし、プロファイルの情報が複数個所にある場合は、credentialsファイルのキーが優先されます。

です。

この前半部分を読んで、configファイルに認証情報全部を書けると思い込んでしまいました。でも、上記の意訳からもわかるように、書けることはかけるんですが、(同じプロファイル)に対する認証情報が複数ある場合、credentialsファイルのものが優先的に使われるそうです。 やられました。

更なる間違い

上記の問題が大きいので、些細なことですが、さらに、ついでに間違っていたのが、config.s3 ファイルの書き方です。 config.s3 ファイルを、

bitnami@ip-172-30-0-73:~/.aws$ cat config.s3
[s3]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットアクセスキー
region = ap-northeast-1
bitnami@ip-172-30-0-73:~/.aws$ 

と書いており、いつつけたか覚えのない s3 というプロファイル名がついていました。 これは、プロファイル名になるはずなので、切り替えたければ、 –profile s3 のようにコマンド実行時にプロファイル名も指定する必要がありました。

仮にここを [default] に修正すると、

bitnami@ip-172-30-0-73:~/.aws$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************aaaa shared-credentials-file    
    region           ap-northeast-1      config-file    /home/bitnami/.aws/config.s3
bitnami@ip-172-30-0-73:~/.aws$ 

のように、regionは正しく認識されました(もっとも、上記の二重に認証情報がある場合の問題が残っているので、これでも使えませんがね)。

最終的な設定内容

で、結局、認証情報を使い分けるために、プロファイルを追加することとしました。ここで、プロファイル名は s3user としています。 設定後のファイルはこんな感じになります。

~/.aws/credentials

[default]
aws_access_key_id = EC2アクセス用のアクセスキー
aws_secret_access_key = EC2アクセス用のシークレットアクセスキー

[s3user]
aws_access_key_id = S3アクセス用のアクセスキー
aws_secret_access_key = S3アクセス用のシークレットアクセスキー

~/.aws/config

[default]
region = ap-northeast-1

[profile s3user]
region = ap-northeast-1

–profile s3user をつけてコマンドを実行すると、S3 用ユーザーの認証情報が使われています。

bitnami@ip-172-30-0-73:~/.aws$ aws configure list --profile s3user
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                   s3user           manual    --profile
access_key     ****************BBBB shared-credentials-file    
secret_key     ****************bbbb shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
bitnami@ip-172-30-0-73:~/.aws$ 

念のために、 –profile なしを試すと、ちゃんと EC2 用ユーザーの認証情報が使われます。

bitnami@ip-172-30-0-73:~/.aws$ aws configure list                                                                                                                     
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************AAAA shared-credentials-file    
secret_key     ****************aaaa shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
bitnami@ip-172-30-0-73:~/.aws$ 

この認証情報を使うようにバックアップスクリプトを修正したら、問題なく動作しました。 めでたし、めでたし。