EC2 のタグを SDK で操作

ついこの間に golang を初めて触り1, 大学の授業過程で AWS EC2 を使っていて, そのタグ機能を色々機械的に操作できれば便利だななどと思い, golang でなにか作る良い機会であるような気がしたので, 取り敢えず AWS EC2 のタグ機能に関する操作一式をそれなりに揃えたコマンドラインツールを作ってみた. 実装部分にかかった時間は 30 分程度であった. golang に慣れない身でも, API, 標準ライブラリ, ドキュメントが整備されているおかげでサクサクと動くところまで持っていくことができた.

以下は Usage である (ほぼリポジトリにおいてある README のままであるが).


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 の設定およびアクセスキーの設定が済んでいること.↩︎


De Bruijn Sequence

大学のレポート内で De Bruijn Sequence について書く機会があった. これまた以前と同じく, 折角なのでこちらのブログにも, 若干内容を変えつつ載せておくことにした.

De Bruijn Sequence は, オランダ人の数学者 Nicolaas de Bruijn に因んで命名された系列で, 特定の長さのすべての組み合わせを含む系列である. 次数 nnkk 種類に関する De Bruijn Sequence B(k,n)B(k, n) は, 長さ nn で表現可能なすべての部分列によって構成される. 次元数 22 (すなわちバイナリ) の De Bruijn Sequence は B(2,n)B(2, n) であり, nn ビットの固有な部分系列から成る 2n2^n ビット長の系列である. 例えば, B(2,3)B(2, 3)00011101(2)00011101_{(2)} であり nn に対する有向グラフが下図1のように示される.

De Burijn Sequence B(2,n)B(2,n) の有向グラフ

golang 始めたてメモ

大学の授業で AWS の API を触る機会があり, その際に golang を使うようなので (API 一覧には, C++ 版もあるようなので, 個人的には C++ が良かった), 特に意義のないコードを取り敢えずいくつか書いてみている. ある程度文法がわかったら, まずはともかくクイックソートを書いてみたわけだが…


C++ で Data.Tuple.Extra っぽいもの

  • 2018/06/15 01:50
  • C++

ふと, C++ でもこんなような記述, 普通に出来るべきなんじゃないかなぁと思った.

Prelude> :m +Data.Tuple.Extra
Prelude Data.Tuple.Extra> uncurry (+) $ first (*2) $ dupe 42
126
Prelude Data.Tuple.Extra> uncurry (+) $ (+42) &&& (*2) $ 42
168

取り敢えず, 似たような構文で同じような処理となるように作ってみた.