AWS IoT セキュアトンネリングの「ローカルプロキシ」をAmazon Linux2にインストールする

まいど、大阪の市田です。
前回、「AWS IoT セキュアトンネリング」の記事を書かせていただきました。その際、デバイスに見立てたEC2にローカルプロキシをインストールしましたが、思ったよりも手間がかかりました。せっかくなのでその手順を残しておきたいと思います。

ファイアウォールを超えてデバイスに接続! AWS IoTセキュアトンネリングを試してみた

前提

利用したOSは下記の通りです。

  • Amazon Linux2
  • AMI:ami-011facbea5ec0363b
  • kernel 4.14 ,systemd 219, GCC 7.3, Glibc 2.26, Binutils 2.29.1

要件

インストールに必要な環境の要件は下記に記載があります。

GitHub - aws-samples/aws-iot-securetunneling-localproxy: AWS Iot Secure Tunneling local proxy reference C++ implementation

  • C++ 14 compiler
  • CMake 3.2+
  • Development libraries required:
    • Boost 1.68 or 1.69
    • Protobuf 3.6.x
    • zlib
    • OpenSSL 1.0+
    • Catch2 test framework

上記の内、必要なものをそれぞれインストールしていきます。githubにインストール手順が書かれているので、その順番で進めたいと思います。

Zlibダウンロードとインストール

zlibはすでにインストール済みなのでスキップします。

$ rpm -q zlib
zlib-1.2.7-17.amzn2.0.2.x86_64

Boost依存関係のダウンロードとインストール

2020年1月20日時点での最新バージョンは、「1.72.0」ですが、「Boost 1.68 or 1.69」という指定があるので、今回は「1.69」をインストールします。

$ wget https://dl.bintray.com/boostorg/release/1.69.0/source/boost_1_69_0.tar.gz -O /tmp/boost.tar.gz
$ tar xzvf /tmp/boost.tar.gz
$ cd boost_1_69_0
./bootstrap.sh

最後のスクリプト実行時に下記のようなエラーが出ます。

./bootstrap.sh
Building Boost.Build engine with toolset ...
Failed to build Boost.Build build engine
Consult 'bootstrap.log' for more details

メッセージに従いbootstrap.logを見ると、次のエラーが出ていました。

###
### Using 'cc' toolset.
###
rm -rf bootstrap
mkdir bootstrap
cc -o bootstrap/jam0 command.c compile.c constants.c debug.c execcmd.c frames.c function.c glob.c hash.c hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c object.c option.c output.c parse.c pathsys.c regexp.c rules.c scan.c search.c subst.c timestamp.c variable.c modules.c strings.c filesys.c builtins.c class.c cwd.c native.c md5.c w32_getreg.c modules/set.c modules/path.c modules/regex.c modules/property-set.c modules/sequence.c modules/order.c execunix.c fileunix.c pathunix.c
./build.sh: 行 17: cc: コマンドが見つかりません

要件にあるとおり、C++のコンパイラが必要なのでインストールします。

$ sudo yum -y install gcc-c++

続きから再開しましょう。

$ ./bootstrap.sh
$ sudo ./b2 install

Protobuf依存関係のダウンロードとインストールする

次も手順の通りに実行したいところですが、コマンドの記載にミスがあるのでそのままコピペすると失敗します。下記のとおり修正して実行します。

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gz -0 /tmp/protobuf-all-3.6.1.tar.gz

↓

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gz -O /tmp/protobuf-all-3.6.1.tar.gz
$ tar xzvf /tmp/protobuf-all-3.6.1.tar.gz
$ cd protobuf-3.6.1/
$ mkdir build
$ cd build
$ cmake ../cmake

ここでまたエラーが出ました。

-bash: cmake: command not found

ここでyumコマンドでcmakeをインストールしたいところですが、標準ではバージョン「2.8」となります。

$ sudo yum info cmake
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
Name        : cmake
Arch        : x86_64
Version     : 2.8.12.2
Release     : 2.amzn2.0.2
Size        : 6.9 M
Repo        : amzn2-core/2/x86_64
Summary     : Cross-platform make system
URL         : http://www.cmake.org
License     : BSD and MIT and zlib
Description : CMake is used to control the software compilation process using simple
            : platform and compiler independent configuration files. CMake generates
            : native makefiles and workspaces that can be used in the compiler
            : environment of your choice. CMake is quite sophisticated: it is possible
            : to support complex environments requiring system configuration, preprocessor
            : generation, code generation, and template instantiation.

CMakeを「2.8」のままインストールすると下記のようなエラーが発生します。

CMake Error at CMakeLists.txt:2 (cmake_minimum_required):
  CMake 3.1.3 or higher is required.  You are running version 2.8.12.2

冒頭の要件ではCMakeは「3.2」以上のバージョンが必要なので、ソースからインストールすることにします。

$ cd ${home}
$ wget https://cmake.org/files/v3.16/cmake-3.16.0.tar.gz
$ tar xvzf cmake-3.16.0.tar.gz
$ cd cmake-3.16.0
# ./bootstrap && make && make install

CMakeのインストール中に次のようなエラーが出ました。openssl-develパッケージをインストールするのが簡単そうです。

-- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)
CMake Error at Utilities/cmcurl/CMakeLists.txt:454 (message):
  Could not find OpenSSL.  Install an OpenSSL development package or
  configure CMake with -DCMAKE_USE_OPENSSL=OFF to build without OpenSSL.


-- Configuring incomplete, errors occurred!
See also "/home/ec2-user/cmake-3.16.0/CMakeFiles/CMakeOutput.log".
See also "/home/ec2-user/cmake-3.16.0/CMakeFiles/CMakeError.log".
---------------------------------------------
Error when bootstrapping CMake:
Problem while running initial CMake
---------------------------------------------

openssl-develをインストールします。

$ sudo yum -y install openssl-devel

再度、cmakeのインストールに挑戦します。

# ./bootstrap && make && make install

これでcmakeのインストールが完了しました。
先ほどのprotobufの作業ディレクトリに戻って、改めてBoost依存関係のインストールに再挑戦します。

$ cmake ../cmake
$ make
$ sudo make install

しかしmakeコマンドの実行中に下記のエラーが出てしまいました。

virtual memory exhausted: Cannot allocate memory

「t3.micro」を利用していましたが、インスタンスタイプは変更せずに512MBのswap領域を作成して対応しました。

$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=512k
$ sudo mkswap /swapfile
$ sudo chmod 600 /swapfile
$ sudo swapon /swapfile
$ swapon

Catch2テストフレームワークのダウンロードとインストール

ここはgithubの手順のままですが、予めgitをインストールしておきます。

$ sudo yum -y install git

Catch2テストフレームワークをインストールします。

$ cd ${home}
$ git clone https://github.com/catchorg/Catch2.git
$ cd Catch2
$ mkdir build
$ cd build
$ cmake ../
$ make
$ sudo make install

これでローカルプロキシ用の環境構築が完了です。

ローカルプロキシのダウンロードとビルド

最後にローカルプロキシをビルドします。githubにある手順の通りで問題ありません。

$ cd ${home}
$ git clone https://github.com/aws-samples/aws-iot-securetunneling-localproxy
$ cd aws-iot-securetunneling-localproxy
$ mkdir build
$ cd build
$ cmake ../
$ make

ビルドが正常に完了すると「bin」ディレクトリの下に2つのバイナリの実行ファイルが保存されます。

$ ls -l ./bin/
total 8320
-rwxrwxr-x 1 ec2-user ec2-user 4028704 Jan 20 00:00 localproxy
-rwxrwxr-x 1 ec2-user ec2-user 4486720 Jan 20 00:01 localproxytest

最後に

基本的にソースからゴリゴリとインストールしていくので、少し時間がかかりました。
また環境構築時は、メモリ1GBの「t3.micro」を利用しましたが、それでは不足するようなので「RaspberryPi 3 B+」を使う場合は、スワップファイルの作成が必要になると思います。

手元にラズパイ4があるのでインストールして試してみたいと思います。

以上です。