page_adsence

2020年6月26日金曜日

AWS CDK と AWS SAM CLI を利用してローカル実行しようとしたらハマった件 Part2

前回、AWS CDK と AWS SAM CLI を使ってローカル開発環境を作っていたのですが、時間を置いて別の環境を作ろうと思ったら別のエラーでハマったのでメモしておきます。

前提

MacOSX         10.14.6(Mojave)
AWS CLI        2.0.19
AWS SAM CLI    0.52.0
AWS CDK        1.44.0 -> (1.47.0 に上げた)

この記事のゴール

下記のエラーを回避し、ローカル環境で Lambda が実行できていること。

発生したエラー

$ yarn run build
yarn run v1.22.0
warning package.json: No license field
warning ../package.json: No license field
$ tsc
bin/cdk-test.ts:4:10 - error TS2305: Module '"/path/to/dir/cdk-test/lib/cdk-test-stack"' has no exported member 'CdkTestStack'.

4 import { CdkTestStack } from '../lib/cdk-test-stack';
           ~~~~~~~~~~~~

lib/cdk-test-stack.ts:9:45 - error TS2345: Argument of type 'this' is not assignable to parameter of type 'Construct'.
  Type 'CdkSampleStack' is not assignable to type 'Construct'.
    Property 'onValidate' is protected but type 'Construct' is not a class derived from 'Construct'.

9     const helloLambda = new lambda.Function(this, "helloLambda", {
                                              ~~~~

lib/cdk-test-stack.ts:16:45 - error TS2345: Argument of type 'this' is not assignable to parameter of type 'Construct'.

16     const helloApi = new apigateway.RestApi(this, "helloApi", {
                                               ~~~~

test/cdk-test.test.ts:8:31 - error TS2339: Property 'CdkTestStack' does not exist on type 'typeof import("/path/to/dir/cdk-test/lib/cdk-test-stack")'.

8     const stack = new CdkTest.CdkTestStack(app, 'MyTestStack');
                                ~~~~~~~~~~~~


Found 4 errors.

error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

やったこと

$ cdk init --language typescript
$ yarn add @aws-cdk/aws-lambda @aws-cdk/aws-apigateway aws-lambda
$ yarn add -D @types/node @types/aws-lambda
$ vi lib/cdk-test-stack.ts

Stack の定義は下記のようにした。

import  *  as  lambda  from  '@aws-cdk/aws-lambda'
import  *  as  apigateway  from  '@aws-cdk/aws-apigateway'
import  *  as  cdk  from  '@aws-cdk/core';

export  class  CdkSampleStack  extends  cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Lambda
    const  helloLambda = new  lambda.Function(this, "helloLambda", {
      runtime:  lambda.Runtime.NODEJS_12_X,
      handler:  "index.handler",
      code:  lambda.Code.asset("src")
    });

    // API Gateway
    const  helloApi = new  apigateway.RestApi(this, "helloApi", {
      restApiName:  "helloApi"
    });

    const  samplesResource = helloApi.root.addResource("ping");
    const  getSamplesIntegration = new  apigateway.LambdaIntegration(helloLambda);
    samplesResource.addMethod("GET", getSamplesIntegration);
  }
}

直すためにやったこと

package.json 内の aws-cdk 関連のバージョンをあわせるように修正しました。

修正前

"devDependencies": {
  "@aws-cdk/assert": "1.44.0", <= ここのバージョンが古かった
  "@types/jest": "^25.2.1",
  "@types/node": "10.17.5",
  "aws-cdk": "1.44.0", <= ここのバージョンが古かった
  "jest": "^25.5.0",
  "ts-jest": "^25.3.1",
  "ts-node": "^8.1.0",
  "typescript": "~3.7.2"
},
"dependencies": {
  "@aws-cdk/aws-apigateway": "^1.47.0",
  "@aws-cdk/aws-lambda": "^1.47.0",
  "@aws-cdk/core": "1.44.0", <= ここのバージョンが古かった
  "aws-lambda": "^1.0.6",
  "source-map-support": "^0.5.16"
}

修正後

"devDependencies": {
  "@aws-cdk/assert": "^1.47.0",
  "@types/jest": "^25.2.1",
  "@types/node": "10.17.5",
  "aws-cdk": "^1.47.0",
  "jest": "^25.5.0",
  "ts-jest": "^25.3.1",
  "ts-node": "^8.1.0",
  "typescript": "~3.7.2"
},
"dependencies": {
  "@aws-cdk/aws-apigateway": "^1.47.0",
  "@aws-cdk/aws-lambda": "^1.47.0",
  "@aws-cdk/core": "^1.47.0",
  "aws-lambda": "^1.0.6",
  "source-map-support": "^0.5.16"
}

原因

正直最初は原因が全くわからず・・・。
ググってもピンポイントな記事は見つからず・・・。

とはいえ、少し前は問題なく動かすこと出来ていたので、一旦動いていた時のバージョンを下げてみたところ、ちゃんとビルドできるようになりました。

とりあえず動いたので、これで終わりにしようかと思っていたのですが、package.json の中身を見てみると、yarn add で追加した @aws-cdk/aws-apigateway@aws-cdk/aws-lambda のパッケージのバージョン(1.47.0)と、@aws-cdk/core のバージョン(1.44.0)があっていないことに気づきました。
もしかしてと思って、諸々のバージョンをあわせるような形で修正をしたら、きちんと最新のバージョンで動くようになりました。

私の環境では、cdk はグローバルにインストールしているのですが、ここのバージョンが古かったせいで、cdk init した際に生成される package.json のファイルのバージョンが古く、後から yarn add で追加したパッケージのバージョンは最新が追加され、バージョンの乖離が発生してしまっていたという状態でした。

今回の反省点

前回同様、インストールしたことに満足せず、きちんとバージョン確認します・・・。
反省点活かせてない。
仕事で使っているわけではないので、ついバージョンアップは怠けがち。

2020年6月7日日曜日

AWS CDK と AWS SAM CLI を利用して、API Gateway + Lambda をローカル実行しようとしたらハマった件

AWS CDK が使えるのかどうか試してみようと思ってハマった内容をメモとして残しておきます。

前提

MacOSX         10.14.6(Mojave)
AWS CLI        1.16.155
AWS SAM CLI    0.15.0 -> 0.52.0(バグの回避のためにバージョン上げた時のバージョン)
AWS CDK        1.44.0
Docker for Mac 2.3.0.3

この記事のゴール

下記のエラーを回避し、ローカル環境で Lambda が実行できていること。

発生したエラー

$ sam local start-api -t template.yaml --docker-network bridge
2020-06-07 10:52:59 Found credentials in shared credentials file: ~/.aws/credentials
Error: Template does not have any APIs connected to Lambda functions

やったこと

brew 経由で AWS SAM CLI をインストール

brew install aws-sam-cli

AWS CDK をインストール(AWSの公式を参考に)

npm install -g aws-cdk

クラメソさんの記事を参考に、API Gateway + Lambda をローカルで動かす準備をした。

直すためにやったこと

// pip 経由でインストールした aws-sam-cli を削除
$ pip uninstall aws-sam-cli

// シェル再起動
$ exec $SHELL -l

// sam コマンドがあるか確認。brew でインストールしたものが残っていそうなことは確認できた
$ which sam
/usr/local/bin/sam

// sam cli のバージョン確認
$ sam --version
SAM CLI, version 0.52.0

// 一応 brew 側のバージョンも確認
$ brew info aws-sam-cli
aws/tap/aws-sam-cli: stable 0.52.0 (bottled), HEAD
AWS SAM CLI 🐿 is a tool for local development and testing of Serverless applications

原因

AWS SAM CLI のバージョンが古かったことが原因だったっぽい。
最新のバージョンに上げたことで解消できた。

はっきりとした原因が発見できたわけではなく、いろんな記事を渡り歩いたらこの結論に至ったという形。

気づけたのは sam start-api ではなく sam local invoke を実行してみたら、nodejs12.X 系のランタイムはサポートしてないとか言われたので、aws-sam-cli のバージョン確認してみたらやたら古かった。
どうやらはるか昔に pip 経由でインストールした aws-sam-cli があり、そっちのパスが通っていたらしく、今回brew 経由でインストールした方は利用されなかった。

今回の反省点

インストールしたことに満足せず、きちんとバージョン確認します・・・。

2020年2月15日土曜日

Mac OS へ Amazon Corretto のインストールとバージョン切り替え

前提条件

  • anyenv がインストール済みであること。

Amazon Corretto 11 のインストール

$ brew cask install corretto
==> Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 81, done.
remote: Counting objects: 100% (81/81), done.
remote: Compressing objects: 100% (74/74), done.
remote: Total 413960 (delta 39), reused 13 (delta 7), pack-reused 413879
Receiving objects: 100% (413960/413960), 188.59 MiB | 1.33 MiB/s, done.
Resolving deltas: 100% (292409/292409), done.
Tapped 1 command and 3536 casks (3,652 files, 202.3MB).
==> Downloading https://corretto.aws/downloads/resources/11.0.6.10.1/amazon-corretto-11.0.6.10.1-2-macosx-x64.pkg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'corretto'.
==> Installing Cask corretto
==> Creating Caskroom at /usr/local/Caskroom
==> We'll set permissions properly so we won't need sudo in the future.
Password:
==> Running installer for corretto; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
installer: Package name is Amazon Corretto 11
installer: Upgrading at base path /
installer: The upgrade was successful.
🍺  corretto was successfully installed!

Amazon Corretto 8 のインストール

古いバージョンも登録されているリポジトリを追加
$ brew tap homebrew/cask-versions
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
awscli@1                 cacli                    gh                       katago                   libdeflate               pueue
==> Updated Formulae
abcmidi                       conan                         groovysdk                     maven@3.2                     procs
ace                           corral                        gsoap                         maven@3.3                     profanity
agedu                         cppad                         haproxy                       maven@3.5                     proj
akka                          crystal                       helm                          mesa                          proteinortho
allegro                       cython                        helm@2                        metabase                      psqlodbc
angular-cli                   dar                           helmfile                      mgba                          pumba
ansible                       dartsim                       hevea                         micro                         pyinvoke
apache-arrow                  dateutils                     hlint                         minikube                      pympress
apache-arrow-glib             deno                          homebank                      minio                         python-markdown
apache-ctakes                 dive                          http-parser                   mint                          qxmpp
apache-flink                  dmd                           hugo                          mk-configure                  repo
appstream-glib                docker-completion             i2p                           modules                       rex
arcade-learning-environment   dovecot                       i386-elf-gdb                  movgrab                       riff
arduino-cli                   dvc                           icecream                      nano                          ruby-build
armadillo                     elixir                        imgproxy                      nats-streaming-server         run
asymptote                     emscripten                    ioping                        navi                          rust
atlassian-cli                 erlang                        istioctl                      ncdu                          salt
ats2-postiats                 exploitdb                     jboss-forge                   nesc                          scons
avro-c                        eye-d3                        jena                          nng                           sfk
avro-cpp                      fail2ban                      jenkins                       nnn                           sile
avro-tools                    fantom                        jhipster                      node-build                    simgrid
aws-cdk                       fauna-shell                   jsonnet                       node@12                       simple-scan
aws-sdk-cpp                   fcl                           jsonschema2pojo               now-cli                       sip
awscli                        fdclone                       kops                          nss                           skopeo
bash                          feh                           kubecfg                       ocp                           snakemake
beast                         findomain                     kubernetes-cli                opa                           sphinx-doc
benthos                       fio                           kyma-cli                      openssh                       starship
bitrise                       fish                          lazygit                       openttd                       stress-ng
bmake                         fits                          ldns                          operator-sdk                  subnetcalc
broot                         fluent-bit                    ledger                        ott                           swiftlint
byacc                         flyway                        lftp                          packer                        sysdig
byobu                         folly                         libarchive                    paket                         terragrunt
caf                           freeswitch                    libcdr                        par2                          texlab
cdogs-sdl                     fx                            libdap                        pcre                          tile38
cfn-lint                      gauge                         libfixbuf                     petsc                         tomcat
chakra                        gdb                           libgee                        petsc-complex                 tomcat@8
check_postgres                gimme-aws-creds               libgpg-error                  phpunit                       ttyd
checkbashisms                 gist                          libmtp                        picard-tools                  txr
cimg                          glooctl                       libphonenumber                platformio                    v8
citus                         gmic                          libpqxx                       pod2man                       vala
ckan                          go                            libpsl                        postgresql                    verilator
clojure                       go@1.12                       libtrace                      postgresql@10                 wtf
clojurescript                 godep                         liquibase                     postgresql@11                 xtensor
closure-compiler              gosu                          lldpd                         postgresql@9.4                yq
cmake                         gradle                        lxc                           postgresql@9.5                zeek
cobalt                        groovy                        maven                         postgresql@9.6
==> Deleted Formulae
python@2

==> Tapping homebrew/cask-versions
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask-versions'...
remote: Enumerating objects: 194, done.
remote: Counting objects: 100% (194/194), done.
remote: Compressing objects: 100% (189/189), done.
remote: Total 194 (delta 14), reused 44 (delta 2), pack-reused 0
Receiving objects: 100% (194/194), 84.67 KiB | 422.00 KiB/s, done.
Resolving deltas: 100% (14/14), done.
Tapped 163 casks (211 files, 334.9KB).
インストールする。
$ brew cask install corretto8
==> Downloading https://corretto.aws/downloads/resources/8.242.08.1/amazon-corretto-8.242.08.1-1-macosx-x64.pkg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'corretto8'.
==> Installing Cask corretto8
==> Running installer for corretto8; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
installer: Package name is Amazon Corretto 8
installer: Upgrading at base path /
installer: The upgrade was successful.
🍺  corretto8 was successfully installed!

anyenv を使って jenv をインストールする

$ anyenv install jenv
/var/folders/90/hcnfc9cn5dz9xtbjp3ndvl4h0000gn/T/jenv.20200215134045.48505 ~
Cloning https://github.com/gcuisinier/jenv.git master to jenv...
Cloning into 'jenv'...
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 1166 (delta 16), reused 5 (delta 1), pack-reused 1131
Receiving objects: 100% (1166/1166), 434.55 KiB | 665.00 KiB/s, done.
Resolving deltas: 100% (529/529), done.
~

Install jenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.
profile をリロードする。
$ exec $SHELL -l

jenv に各種バージョンの JAVA_HOME を追加

現状の JAVA_HOME を確認
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.6, x86_64:     "Amazon Corretto 11"/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
    1.8.0_242, x86_64: "Amazon Corretto 8" /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
ここで表示されている( /Library から始まっている)ディレクトリを直接記載してもいいのだが、せっかくコマンドが用意されているので、それを使って記載する。
$ jenv add $(/usr/libexec/java_home -v 11)
corretto64-11.0.6 added
11.0.6 added
11.0 added
11 added
$ jenv add $(/usr/libexec/java_home -v 1.8)
corretto64-1.8.0.242 added
1.8.0.242 added
1.8 added

jenv のバージョンを切り替える

現状はこうなっている。
$ jenv versions
* system (set by /Users/naoki/.anyenv/envs/jenv/version)
  1.8
  1.8.0.242
  11
  11.0
  11.0.6
  corretto64-1.8.0.242
  corretto64-11.0.6
$ java -version
openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment Corretto-11.0.6.10.1 (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.6.10.1 (build 11.0.6+10-LTS, mixed mode)
global のバージョンを 1.8 系に変更する
$ jenv global 1.8
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment Corretto-8.242.08.1 (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM Corretto-8.242.08.1 (build 25.242-b08, mixed mode)
global のバージョンを 11系に変更する
$ jenv global 11
$ java -version
openjdk version "11.0.6" 2020-01-14 LTS
OpenJDK Runtime Environment Corretto-11.0.6.10.1 (build 11.0.6+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.6.10.1 (build 11.0.6+10-LTS, mixed mode)
こんな感じで切り替えることができるようになった。

2019年8月20日火曜日

cargo newしたらエラーが出て困った(原因は全く別のことだった)件

会社で使っているMacにRustを入れて勉強しようと思ったら、cargo newで詰まったので、その時のメモ。
ちなみに会社のMacに入れる前に、自宅で使っているMacにも同じことをしたのですが、エラーが出たのは会社のMacだけでした。
Rustのインストールはrustupを使ってインストールしました。本件には関係ないのでインストール方法は割愛します。

  1. 適当なディレクトリへ移動
    $ cd /Users/your-username/example-dir
    
  2. cargo new コマンドを実行すると、下記の様なエラーが発生する
    $ cargo new sample
    error: Failed to create package `sample` at `/Users/your-username/example-dir/sample`
    
    Caused by:
      could not find '$HOME/.git_template/' to stat: No such file or directory; class=Os (2); code=NotFound (-3)
    

これでなぜエラーになるのか、全然分かりませんでした。
自宅のMacではうまく行っていたので、rustup自体のバグというのは考えにくい。
とりあえずエラーが出ているgit init.templatedirをコメントアウトしてみることにしました。

$ vi ~/.gitconfig

[init]
    # templatedir = $HOME/.git_template <- この行をコメントアウトした

この状態でcargo newしたら動いたー。
git_templateの設定周りの不備だということは分かったのですが、そこから先が長かったです・・・。
エラーメッセージをコピってググってもそれらしい記事が出てこず・・・。

ふと気づいたのが、そもそもgit_templateをはるか昔に設定してみたけど、一度も使っていない。
そして当時動作確認をしたかどうかすら記憶にない。

ということで、もう一回gitの設定を見直してみました。
ちょっとググると、$HOMEなんて設定している記事が一つも出てきませんでした。

早速 .gitconfig のファイルを編集してみた。

$ vi ~/.gitconfig

[init]
    templatedir = ~/.git_template

そして、cargo newコマンドを実行したら

$ cargo new sample
   Created binary (application) `sample` package

ちゃんと動きました!

2018年4月25日水曜日

Macのローカル環境でSparkのWeb UIをみる方法

何度か調べているので、忘れないようにメモしておく。

AWSとかでEMR使っている場合は、SparkのWebUIはデフォルトで利用出来るようになっているのですが、
ローカル環境で使おうとすると、WebUIのURLは出てくるけど、アクセスすると応答なしになってしまいます。
なので、ローカルで実行する時にはSparkSessionを作成する時に、UIを有効にする設定をしないといけない。

val spark = SparkSession.builder.config("spark.ui.enabled", value = true)

公式ドキュメントを見ると、デフォルトが true になっているけど、上記を指定せずにローカルで実行したら None になっていた。

2018年2月24日土曜日

デブサミ2018に行ってきました

去年に引き続き、デブサミに行ってきました。
山手線が混んでいて、行くだけで疲れましたが・・・。
今いる会社はレポートさえ書けば平日でもこういったイベントに行かせてくれるので非常にありがたいです。
早速聞いてきたセッションの概要と感想を書いていきたいと思います。

技術選定の審美眼

結論

技術の変化は振り子ではなく螺旋である。
その差分を読み取る能力と、それを可能にした技術が重要。
すべてを習得するのは不可能なので、スルーするかしないかを決める。
コスト構造が変わるものはスルーしない。

感想

初めて和田卓人さんのセッションを聞きました。
自分はそんなに聞き取り能力高くないのですが、非常にわかりやすいセッションだった気がします。
このスライドに関しては初演ということもあり、時間切れで最後まで聞くことはできませんでしたが、
非常に面白かったですし、新しい技術が次々出てくる時代で、どうやって取捨選択すればいいのかを迷っていた自分にはとてもよい内容でした。

データを活かす組織の作りかた、事業に寄り添う分析・機械学習基盤の育てかた

結論

データ分析・機械学習基盤を作るための3ステップ
- まずは存在するデータを分析してみる
- 難易度低めところに部分的に導入してみる
- 考えを広げ、価値のあるデータの集め方や、それらを使って新しい価値の想像をしたりといい循環が回るようにする

感想

もともとデータを活かす文化が会社にはあって、それを土台にしつつデータ分析基盤を作ったというような印象。
当然データ基盤だけ作っても意味はないので、データを使う文化を作っていくのはとても大変そうだけど、一番大事なことかなと。

Spinnakerで実現するデプロイの自動化

結論

学習コストは高いけど結構便利。
Blue/Greenデプロイ出来てないなら試してみて。
バグがあったり、コンポーネント間の関係が複雑で原因特定大変だけど、いいツール。

感想

Spinnakerというツールはここで聞くまで知らなくて、面白いツールあるんだなーと。
まだまだバグがあるみたいですが、活用事例が出始めているので、これから使ってみてもいいのかなと思いました。

マルチクラウドで構築する大規模解析サービス~戦略とポイントについて

結論

各クラウドベンダーの特徴を把握して、いいとこ取りが出来ればマルチクラウドはあり。
クラウド間の差分を吸収する統一的なインターフェースを利用することで、利用者がマルチクラウドであることを意識しないといけないケースを減らす。
ハマりどころがあるので、注意が必要。

感想

マルチクラウドって複数クラウドベンダーをちょっとずつ使っているのかと思いきや、AWSとGCPで同じような形で構成していて、どっちかのクラウド環境が落ちても、もう片方のクラウド環境で対応することが出来て、高可用性を実現しているとのこと。
最初の環境構築の部分はすごく大変そうだけど、構築してしまえば結構いけそうな感覚が持てた。
デプロイにはSpinnaker使っていて、意外と行けているらしい。

将棋プログラムPonanzaにおける強化学習、ディープラーニングとその先

感想

ちょっと内容が難しすぎて、機械学習をまだ勉強できてない身では難しすぎて全然話についていけなかったです・・・。
とりあえずAlphaGoZeroすごいってことと、将来的にはAIを作るAIが出てくるのではっていうことでした。

総括

選んだセッションのせいというのがあるとは思いますが、結構Dockerを本番環境まで当たり前のように使っている会社が多くなってきたなーという印象を持ちました。
Dockerは手元の開発環境で使うにはお手軽で非常に便利なのは実感出来ているのですが、セキュリティとかをどう考えればいいのかがよくわかっていなくて、未だに本番環境では使えていません。
この辺はもっと勉強しないといけないなーと。

去年に続き今年もデブサミに参加したのですが、やっぱり人がすごいいっぱいいてめちゃくちゃ疲れました・・・。
でも、新しい発見とか勉強になったセッションもあったので、年一で刺激を受けるにはいい場所だと思います。
来年も行けるかどうかはわからないですが、とりあえず来年のデブサミまで一年間頑張って勉強していこうと思います。
それでは。

2018年2月14日水曜日

Amazon Linux 2のイメージを使ってみる

背景

現在業務でAmazon Linuxを使っているのですが、Amazon Linux 2に移行したらどうなるのかなーと思ったのと、
個人的に会社の環境をコンテナ化していったらどうなるかなーというのを試してみたかったのがきっかけ。
そのためにまず Amazon Linux 2 のイメージを落としてみようと思いました。

とりあえず調べてみる

どうやらAmazon Linuxのイメージの取得方法は2種類あるらしい。
最近DockerHubから落とせるようになったって話題になっていたので、DockerHubから落とせるのは知っていたのですが、
AWS ECRからも落とせるみたいですね。

それぞれ、ダウンロードする為に必要なものは下記の通り。

  1. AWS ECR からDockerイメージをダウンロードする方法
    -> AWSのアカウントが必要

  2. DockerHubから取得する方法
    -> DockerHubのアカウントが必要

AWS ECRからダウンロードするのはAWSのアカウントが必要になるので、会社で試しにやってみたのですが、結構面倒でした。
DockerHubで落としてくる方が断然楽なので、こちらをオススメします。

やってみる

DockerHubのアカウントの発行に関しては、事前に済ませている前提で進めます。

  1. ターミナル上でDockerHubにログインする

    docker login
    

    ログイン時のユーザー名を入力する

    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: (DockerHubのユーザー名。メールアドレスではない。)
    

    ログイン時のパスワードを入力する

    Password: (DockerHubのログイン時に使用するパスワード)
    

    認証情報が合っていればログインに成功した旨が表示される

    Login Succeeded
    
  2. DockerHubからimageをpullしてくる

    docker pull amazonlinux
    
  3. Amazon Linux 2 のコンテナに入ってみる

    docker run -it amazonlinux /bin/bash
    
  4. OSの確認

    # cat /etc/os-release
    NAME="Amazon Linux AMI"
    VERSION="2017.09"
    ID="amzn"
    ID_LIKE="rhel fedora"
    VERSION_ID="2017.09"
    PRETTY_NAME="Amazon Linux AMI 2017.09"
    ANSI_COLOR="0;33"
    CPE_NAME="cpe:/o:amazon:linux:2017.09:ga"
    HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
    

以上でAmazon Linux 2のイメージをダウンロードしてくることが出来ました。
AWS ECRからダウンロードするのは面倒だけど、DockerHubから落としてくるのはめっちゃ楽でした。
あと、Amazon Linux 2って言っているけど、ec2-userがいるわけでもないし、普通にalpineのイメージと大差ない感じでした。
まぁベースイメージとしてはこんな感じなのかなぁという気がしないでもない。

2017年9月10日日曜日

Jenkins公式のDockerイメージを使って、プラグインインストール済みのJenkinsイメージを作る

Dockerを使ってJenkinsサーバを立てようと思ったのですが、プラグインをインストールした状態のイメージを自分で作りたくて色々調べたので、その結果を書いていこうと思います。

まず最初に見つけたのが下記のリポジトリのものです。

blacklabelops/jenkins

docker-composeで立ち上げる際に、env_fileを食わせてやることで、プラグインインストール済みのJenkinsサーバが立ち上がるらしいのですが、インストールしたいプラグインを入れても、なぜか上手くいかなかったので別のを探すことに。

引き続き調べていたら、Jenkins公式の配っているイメージでもプラグインをインストール出来ることがわかったので、それを試してみました。

jenkins

FROM jenkins
COPY plugins.txt /usr/share/jenkins/ref/
COPY custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt

こんな感じで書くとプラグインがインストール出来ると書いてあるのですが、依存関係を自動で解決してくれないので、依存しているプラグインを全部自力で順番通りに書かないといけないということで、ちょっとだけやってみたのですが、現実的ではないということでこれも諦めました。

Jenkinsのコンテナ作って中に入って色々見ていたら、気になるシェルスクリプトを見つけたので、試しに使ってみることにしました。

FROM jenkins
RUN /usr/local/bin/install-plugins.sh git github

こんな感じで、インストールしたいプラグインIDを空白区切りで列挙します。
記載が終わったらビルドして新しいJenkinsのイメージを作ります。

docker build . -t jenkins

続いて、docker-compose.ymlに下記のように指定します。

jenkins:
  image: jenkins
  container_name: jenkins
  ports:
   - "8080:8080"
   - 50000
  volumes_from:
    - volumes
  environment:
    - JAVA_OPTS="-Djenkins.install.runSetupWizard=false"

volumes:
  image: busybox
  container_name: jenkins_data
  volumes:
    - /var/jenkins_home

この中でJenkinsの初回起動時のウィザードを出さないようにしています。
で、

docker-compose up -d

で起動します。

http://localhost:8080/

にアクセスして、Jenkinsのプラグイン管理の画面に行くと、ちゃんとインストールされてました!
DockerHubの方のページには書いてなかったので気づけなかったのですが、githubの方にはちゃんと書いてありました・・・。

jenkinsci/docker

なんにせよこれでプラグインの依存関係を気にせず入れれるようになりました。

2017年8月4日金曜日

IntelliJとVisualVMでScalaのベンチマークを取る

Scalaで作っているAPIサーバがあるのですが、自分が作った部分がリリースされた直後、APIのレスポンスが悪くなりアラート連発という事態が発生。
今回のリリースで対象のAPIサーバをいじったのは自分だけ。
しかし、ソースはレビュー済みで、切り戻し後にもう一度確認してみたのですが、誰が見ても特に重そうという処理はしてなさそうという結論に至りました。

そこで、修正前後のベンチマークを取って比べてみようということに。
最初は「sbt-jmh」を使ってベンチマークを取ろうとしたのですが、うまく行かず・・・。
Javaでプロファイルするのに使っていたVisualVMというものがあって、もしかしたらそれでScalaのプロファイルも出来るかもというアドバイスを貰ったので、早速調べてみると比較的最近の記事が出てきました。

Scalaで書いたProcessing のプログラムを VisualVM でプロファイルする

上の記事を見てScalaのプロファイル取れることがわかったので、早速導入してみた。

VisualVMの入手とインストール

  1. VisualVM にアクセス
  2. Download ボタンをクリック
  3. Mac OS X Application Bundleをクリックしダウンロードしてくる
  4. 落としてきたdmgファイルダブルクリックしてインストール

IntelliJのプラグインの入手と設定

  1. Preferences -> Plugins -> Browse repositories -> 検索窓に「VisualVM Launcher」と入力し、「Install」ボタンをクリック
  2. プラグインのインストールが完了すると、「Restart IntelliJ IDEA」ボタンに切り替わるので、IntelliJを再起動する。
  3. Preferences -> Other Settings -> VisualVM Launcher のメニューをクリックし、
    VisualVM executable: に 「/Applications/VisualVM.app/Contents/MacOS/visualvm」 と入力
  4. それ以外の部分はそのままにして、OKをクリック
  5. 通常の「Run」や「Debug」と同じ様に、「Run With VisualVM」か「Debug With VisualVM」を押すと、アプリが起動する。
    ■ Before

    ■ After
  6. メニューの方も変わっている
    ■Before

    ■After
  7. 後は勝手にVisualVMが起動するので、必要な部分を見ればOK

以上で設定は完了です。

2016年7月4日月曜日

IntelliJを使ってGo言語の開発環境を整えてみる for Windows

会社のPCは現在Windowsなので、Windows上でGo言語の開発環境を作ってみた。
OS:Windows7
IntelliJ:15.0.6
今回行う事は大きく2つです。
1. Windows上へのGoのインストール
2. IntelliJ側のプラグインのインストールと設定
では早速Goのインストールから始めようと思います。

Go SDKのインストール

  1. 下記のサイトからGoのインストーラー「go1.6.2.windows-amd64.msi」をダウンロードしてきます。
    https://golang.org/dl/
  2. インストーラーを起動し、インストールを開始します。
    インストーラーはデフォルトだとインストール先がC:\Goになっているので、
    別のディレクトリに入れたい場合は、任意のディレクトリを指定して下さい。
  3. インストールが完了したら、コマンドプロンプトを起動し、goのバージョンを確認します。
    > go version
    バージョンの確認が出来たらプロンプトは閉じても問題ありません。
    ※この時点でPathやGOROOT等の環境変数は自動で設定されています。
これでGoのインストール作業は完了です。
では引き続きIntelliJ側の設定を行っていきます。

IntelliJのPluginインストール

  1. IntelliJを起動します。
  2. 「Welcome to IntelliJ IDEA」の画面右下の「configure」→「Plugins」をクリック
  3. 画面下側の「Browse repositories…」をクリック。
  4. 画面上部の検索窓に「GO」と入力し、「GO」と書いてあるものをインストールします。
  5. プラグインのインストールが完了すると、再起動を求められるので、IntelliJを再起動します。

  6. 再起動したら、「Welcome to IntelliJ IDEA」画面で「Create New Project」をクリック。
  7. 画面左側のリストにGoがあるので、GoをクリックしてNextをクリック
  8. Procjet SDKの画面で「Configure...」をクリック
  9. Goをインストールしたディレクトリを指定し、OKを押下、Project SDKにGoと出てれば、Nextボタンを押下する。
    (Go言語をインストール時に何も変更指定なければ、C:\Goにインストールされているので、そのままOKを押せば問題ない)

  10. Procjet NameとProject locationを任意の場所にしてFinishをクリック
  11. 開いたプロジェクトでGo Fileを追加して、Hello World的なのを書いてみる。
    package main
    
    import "fmt"
    
    func main(){
     fmt.Printf("Hello World!")
    }
  12. 書いたら実行(メニューバーのRun -> Run ‘go run XXXXX.go’)
  13. コンソールにHello World!と出れば成功!
古い情報とかだとjarファイル落としてこないといけないとか書かれていますが、
基本的にはGoをインストールとIntelliJの画面内の操作で完結するようです。

おまけ

最初はIntelliJのバージョンが15.0.4のものを使っていたのですが、
なぜかGo SDKのディレクトリを指定しても、下記の様なエラーが出てしまって使えませんでした。
「The Selected directory is not a valid home for Go SDK」
IntelliJのバージョンと、Pluginのバージョンが合っていないのかとも思ったのですが、
PluginのREADMEを確認する限りでは問題ありませんでした。
go-lang-idea-plugin
取り敢えずIntelliJの最新バージョンが出てたのでアップデートしてみたら使えるようにはなったのですが、
これで根本原因が解決出来たのかは不明です・・・。