sbt-aws-cloudformationの使い方

sbt プラグインからAWSのCloudFormationを使う場合の手順です。

準備

sbt プロジェクトの project ディレクトリの plugins.sbt に次の内容を追記します

addSbtPlugin("com.pigumer.sbt.cloud" % "sbt-aws-cloudformation" % "5.0.22")

build.sbt に import と Plugin を有効にする設定を記述します

import cloudformation._

lazy val root = (project in file(".")).
  enablePlugins(CloudformationPlugin).
  settings(
    version := "0.1",
    scalaVersion := "2.12.6",
    awscfSettings := AwscfSettings(
      projectName = Some("example/"),
      region = "ap-northeast-1",
      bucketName = "YOUR BUCKET NAME",    // テンプレートをアップロードするS3バケット名
      templates = file("cloudformation")             // アップロードするテンプレートを作成したディレクトリ
    ),
    awscfStacks := Stacks(
      Alias("ALIAS") → CloudformationStack(  // スタック名のエイリアス
        stackName = "STACK_NAME",
        template = "YOUR_TEMPLATE_FILENAME",
        parameters = Map("KEY""VALUE"),
        capabilities = Seq("CAPABILITY_NAMED_IAM")))
    )

awscfSettings の設定項目は次の通りです

  • projectName - プロジェクト名は任意で、S3バケットのキーに追加されます。
  • region - リージョンを指定します。
  • bucketName - S3のバケット名です。
  • templates - テンプレートを作成したディレクトリを設定します。
  • roleARN - クラウドフォーメーションを実行するロールを指定する場合は、roleARNを記述します。

awscfStacks は、スタック名のエイリアスと CloudformationStack を設定します。

CloudformationStack はスタック定義を設定します。

  • stackName - スタック名
  • template - テンプレートファイル名(iam.yaml等)
  • parameters - テンプレートのパラメータに渡す値
  • capabilities - IAMロールのスタックの場合等に"CAPABILITY_IAM"や"CAPABILITY_NAMED_IAM"等の値を設定します

タスク

sbt コマンドを実行します。

sbt

テンプレートをアップロードするS3バケットの作成

awscfCreateBucket <stackName>

指定したスタック名でS3バケットを作成します(CloudFormationを使用します)

テンプレートのアップロード

awscfUploadTemplates

スタックの作成

awscfCreateStack <shortName>

shortName にはスタックのエイリアスを指定します。

スタックの更新

awscfUpdateStack <stage> <shortName>

スタックの削除

awscfDeleteStack <shortName>

Exportsの確認

awscfListExports

その他詳細、最新情報はhttps://github.com/PigumerGroup/sbt-aws-cloudformationを参照してください

DockerでConcourse CIを動かしてみた

f:id:section27:20170513233529p:plain

 Docker Repositoryに書いてあるのと同様ですが、https://github.com/PigumerGroup/sbt-aws-cloudformationを例に手順を説明します。

1. キーを作成し、web と worker の信頼関係を構築します

mkdir -p keys/web keys/worker

ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N ''
ssh-keygen -t rsa -f ./keys/web/session_signing_key -N ''

ssh-keygen -t rsa -f ./keys/worker/worker_key -N ''

cp ./keys/worker/worker_key.pub ./keys/web/authorized_worker_keys
cp ./keys/web/tsa_host_key.pub ./keys/worker
  • keysに作成したキーがあります。

2. docker-compose の設定

docker-compose.yaml を記述します

concourse-db:
  image: postgres:9.5
  environment:
    POSTGRES_DB: concourse
    POSTGRES_USER: concourse
    POSTGRES_PASSWORD: changeme
    PGDATA: /database

concourse-web:
  image: concourse/concourse
  links: [concourse-db]
  command: web
  ports: ["8080:8080"]
  volumes: ["./keys/web:/concourse-keys"]
  environment:
    CONCOURSE_BASIC_AUTH_USERNAME: concourse
    CONCOURSE_BASIC_AUTH_PASSWORD: changeme
    CONCOURSE_EXTERNAL_URL: "${CONCOURSE_EXTERNAL_URL}"
    CONCOURSE_POSTGRES_DATA_SOURCE: |-
      postgres://concourse:changeme@concourse-db:5432/concourse?sslmode=disable

concourse-worker:
  image: concourse/concourse
  privileged: true
  links: [concourse-web]
  command: worker
  volumes: ["./keys/worker:/concourse-keys"]
  environment:
    CONCOURSE_TSA_HOST: concourse-web

3. docker-compose コマンドを使って起動します

次のようなイメージでdocker-compose.yamlのあるディレクリに移動します

cd concourseci

起動するとき、各Dockerが通信を行うため、webの${CONCOURSE_EXTERNAL_URL}には、http://127.0.0.1:8080http://loalhost:8080のようなアドレスを使用することはできません。PCに割り当てられたIPアドレス等を使用するようにします。

PCに割り当てられたIPアドレスが192.168.0.1だとすると次のようになります。

CONCOURSE_EXTERNAL_URL=http://192.168.0.1:8080 docker-compose up -d

4. ブラウザでアクセス

http://localhost:8080 にアクセスしてみてください。下のような画面が開きます。この画面で使用しているOSのflyコマンドをダウンロードします。

f:id:section27:20170513235652p:plain

5. タスクの動作確認

fly execute を使って、タスクの動作を確認することができます。

プロジェクトルートをカレントディレクトリにしておきます。

まず、fly login でログインします。この例では、username は concourse, password は changeme です。

  fly -t concourseci login -c http://192.168.0.1:8080

ここでのタスク例は、AWS S3やAWS CloudFormationへのアクセスが必要となるため、AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY が必要です。aws-cli を使っている場合は、~/.aws/credentials に記述されています。

AWS_ACCESS_KEY_ID=<YOUR AWS ACCESS KEY ID> AWS_SECRET_ACCESS_KEY=<YOUR SECRET ACCESS KEY> \
  fly -t concourseci execute \
  -c ci/build.yaml \
  -i sbt-aws-cloudformation-src=.

Docker for Mac を使っていてうまく動かないなというときは、aufs driverを試してみてください

Docker → Preferences → Daemon → Advanced を次のように設定します

{
  "storage-driver" : "aufs"
}

6. パイプラインの登録

パイプラインの登録は次の通りです。

fly -t concourseci set-pipeline \
  -p sbt-aws-cloudformation \
  -c ci/buildPipeline.yaml \
  -v 'AWS_ACCESS_KEY_ID=<YOUR AWS ACCESS KEY ID>'
  -v 'AWS_SECRET_ACCESS_KEY=<YOUR SECRET KEY>'

pause を解除します

fly -t concourseci unpause-pipeline \
  -p sbt-aws-cloudformation

7. パイプラインの実行

ブラウザを開き、右上のloginのリンクを使ってログインします。チームはmainを選択します。

f:id:section27:20170514001036p:plain

sbt-aws-cloudformation をクリックします

f:id:section27:20170514001615p:plain

右上の + のボタンをクリックすると、パイプラインの実行が開始します

f:id:section27:20170514001818p:plain

f:id:section27:20170514004624p:plain

sbt-aws-cloudformationをMaven Centralに登録したときの手順メモ

上記を参考に作成したSBTプラグインMaven Centralに登録した手順です。

Sonatypeの設定とPublishの手順は、OSSRH Guideに記述されています。 2つの有効なURLが必要です。

SonatypeのJIRAにアカウントを作成します。 アカウントを作成したら、チケットを登録します。

GPGキーの作成とキーサーバに公開キーの送信を行います。私は、MacBookなので、GPG Suiteを使いました。

~/.sbt/0.13/sonatype.sbtにSonatypeのJIRAアカウントの情報を記述します。

credentials += Credentials("Sonatype Nexus Repository Manager",
                           "oss.sonatype.org",
                           "<your username>",
                           "<your password>")

プロジェクトのpublish.sbtに以下の内容を記述します。

publishMavenStyle := true

publishTo := {
  val nexus = "https://oss.sonatype.org/"
  if (isSnapshot.value)
    Some("snapshots" at nexus + "content/repositories/snapshots")
  else
    Some("releases"  at nexus + "service/local/staging/deploy/maven2")
}

publishArtifact in Test := false

pomIncludeRepository := { _ => false }

sonatypeProfileName := "com.pigumer.sbt.cloud"

pomExtra := (
  <url>https://github.com/PigumerGroup/sbt-aws-cloudformation</url>
    <licenses>
      <license>
        <name>MIT</name>
        <url>https://opensource.org/licenses/MIT</url>
      </license>
    </licenses>
    <scm>
      <url>https://github.com/PigumerGroup/sbt-aws-cloudformation</url>
      <connection>https://github.com/PigumerGroup/sbt-aws-cloudformation.git</connection>
    </scm>
    <developers>
      <developer>
        <id>JIRA_ACCOUNT</id>
        <name>NAME</name>
        <url>https://github.com/takesection</url>
      </developer>
    </developers>)

project/plugins.sbtに以下の記述をします。

addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1")
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")

sbtを起動します

sbt

コンパイル

> compile

テスト(Optional)

> scripted

署名タスクとリリースタスクを実行します。

> publishSigned
> sonatypeRelease

Wake console screen with SSH

Raspberry Pi のコンソールをSSH経由でブランクから復帰させるコマンド

$ sudo sh -c "setterm --blank poke --term linux > /dev/tty1 < /dev/tty1"

逆にブランクにする場合

$ sudo sh -c "setterm --blank force --term linux > /dev/tty1 < /dev/tty1"

DisplayのON, OFF

ON

$ vcgencmd display_power 1

OFF

$ vcgencmd display_power 0

Raspberry Pi から LPC1114 への書き込み

lpc21isp のソースを眺めていると、Raspberry Pi の GPIO を使って、リセットとISPモードの制御ができるようになっていたので試してみました

Raspberry Pi と LPC1114の配線

f:id:section27:20170218221003p:plain

lpc21isp のコンパイル

lpc21isp のソースをダウンロードして、次のようにしてビルドすることで、リセットとISPモードの制御に Raspberry Pi の GPIO が使えるようになります。

$ tar xvzf ~/Downloads/lpc21isp_197.tar.gz
$ cd lpc21isp_197
$ make CFLAGS="-Wall -DGPIO_ISP=23 -DGPIO_RST=18"

Raspberry Pi の GPIO のセットアップ

#!/bin/sh

# Configure -ISP signal
echo 23 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio23/direction
echo 1 >/sys/class/gpio/gpio23/value
chown root.gpio /sys/class/gpio/gpio23/value
chmod 660 /sys/class/gpio/gpio23/value

# Configure -RST signal
echo 18 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio18/direction
echo 1 >/sys/class/gpio/gpio18/value
chown root.gpio /sys/class/gpio/gpio18/value
chmod 660 /sys/class/gpio/gpio18/value

bin ファイルの書き込み

lpc21isp -control -bin firmware.bin /dev/ttyAMA0 115200 48000

SDKMANを使ってRaspberry PiにScalaをインストール

SDKMAN

まず、zip をインストールします

$ sudo apt-get install zip

SDKMANをインストールしてパス設定等を反映します

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"

sbt, scala をインストールします

$ sdk install sbt
$ sdk install scala

activator をインストールします

$ sdk install activator

activator の起動がメモリ不足でできないときは、swap を増やして対応します

$ sudo dd if=/dev/zero of=/swapfile bs=4096 count=1048576
$ sudo mkswap /swapfile

/etc/fstab に次の記述を追加します

/swapfile swap swap defaults
$ swapon -a