amazonka で EC2 インスタンスの操作

以前のエントリ1では, AWS の API を golang から叩くために golang の言語機能を一通り触った. 自分は元々よく C++ を書いていたので golang で叩く前にまず C++ から適当に叩いてみていたのだが, ふと Haskell 用の AWS のライブラリの存在を知り, ひとまず触ってみたので, 記録と紹介を兼ねて書き残してみる. 執筆時現時点では, 公式が提供する AWS SDK は awscli を除き C++, Go, Java, javascript, .NET, PHP, Python, Ruby 2となっており, amazonka3 は非公式の Haskell 用 AWS SDK である. 基本的には, まず amazonka を導入した後, 必要となる AWS サービスに該当する amazonka-** を導入する. 今回は, ec2 インスタンスの立ち上げ, 停止を行なったので, amazonka-ec24 を利用した. amazonka は全体のデータのやり取りに Lens を多様しており, 利用者はこの恩恵を傍受できる.

早速であるが, くだらないサンプルを次に示す. とくにいま ec2 インスタンス上で何かしたいことはないので, 東京リージョンでインスタンスを立ち上げて, その直後に落とすこととする5.

module Main where
import qualified Network.AWS as AWS
import qualified Network.AWS.Data as AWSD
import qualified Network.AWS.EC2 as EC2
import System.IO (stdout)
import Control.Lens

instanceIds :: String
instanceIds = "i-********"

main :: IO ()
main = do
    let t0 = EC2.startInstances & EC2.sInstanceIds .~ [AWSD.toText instanceIds]
    let t1 = EC2.stopInstances & EC2.siInstanceIds .~ [AWSD.toText instanceIds]
    env <- AWS.newEnv (AWS.FromFile (AWSD.toText "default") "/path/to/credentials")
    lgr <- AWS.newLogger AWS.Debug stdout
    res0 <- AWS.runResourceT $ AWS.runAWS (env & AWS.envLogger .~ lgr) $ AWS.within AWS.Tokyo $ AWS.send t0
    res1 <- AWS.runResourceT $ AWS.runAWS (env & AWS.envLogger .~ lgr) $ AWS.within AWS.Tokyo $ AWS.send t1
    print res0
    print res1

本家の各 SDK と同じように, 必要なサービスごとにライブラリがそれぞれ独立しているので, 基本的にまずは AWS CLI Command Reference をみてから, その操作を行うのに必要とするライブラリを amazonka から選んで導入することで, 実際に動くまでを円滑に進めることができるだろう.

参照


  1. roki (2018)「golang 始めたてメモ」/roki.log/2018/06/17/golangtrial/\url{/roki.log/2018/06/17/golangtrial/}↩︎

  2. 「AWS SDK とツール」https://aws.amazon.com/en/getting-started/tools-sdks/ 2018 年 6 月 24 日アクセス.↩︎

  3. 参照.↩︎

  4. 参照.↩︎

  5. 前提として, AWS IAM の設定およびアクセスキーの設定が済んでいること.↩︎


ARPパケットに対する挙動からネットワーク上の盗聴者を特定する

通信が暗号化されていればまだ良いが, 自分の送受信しているパケットを同一ネットワーク上の信用できない者/物に無断で見られるのはやはり気持ちの良いものではない. 本エントリではそのような不届き者の存在を仮定して, その不届き者を比較的簡単に特定するといった試みを行う.

お断り

本エントリでの試行は当然ながら私個人のローカル LAN 上で行なっており, 同様の試行を公衆回線上などで行うと迷惑/法に抵触する可能性があるのでやめること. 本エントリに起因する直接的又は間接的な損害に関して, その理由及び原因を問わず著者(Roki) は一切の責任を負わない.

ネットワーク盗聴を検出する原理

ネットワークに接続するためには, 大抵コンピュータに NIC を装着して TCP/IP の設定を済まし, ハブに接続する. 同プロトコルにおける各コンピュータの通信では, IP アドレスと MAC アドレスによる論理情報と物理情報の組み合わせを利用して, 目的のコンピュータに対するパケットの送信を実現する. 通常, その過程で NIC は自分とは無関係であるパケットを破棄する. しかし NIC をプロミスキャスモードにすると, 自分とは無関係であるパケットを破棄せずに取り込むようになる. 盗聴者はこれを利用して, 同一ネットワーク上を流れる他人のパケットを取得できる.