てくなべ (tekunabe)

ansible / network automation / 学習メモ

StackStorm の st2 run コマンドで AWS EC2 インスタンスの状態を取得する

■ はじめに

イベントリブンな自動化ツールである StackStorm は、aws pack(拡張機能)をインストールすることによって、AWSを連携して様々な操作ができるようになります。

この記事では、StackStormのコマンドの実行によりEC2 インスタンスの情報を取得する例をご紹介します。


■ 準備

StackStorm のインストール

今回は、ansible でインストールした環境を利用します。

(参考)

tekunabe.hatenablog.jp

Pack のインストールなど

以下のページを参考にして、Pack のアクセスキーなどの設定を行います。

GitHub - StackStorm-Exchange/stackstorm-aws: st2 content pack containing Amazon Web Services integrations.

アクセスキーなどの認証情報の取扱いには十分ご注意ください。


■ st2 run コマンドで情報取得

それでは、いくつかの例で EC2 インスタンスの情報を取得してみます。

対象リージョンのすべての EC2 インスタンス

特にフィルターを指定せず、対象リージョンのすべてのインスタンスの情報を取得する場合は、以下のようなコマンドを実行します。

・実行コマンド

st2 run aws.ec2_describe_instances 

・情報取得結果例

id: xxxxxxxxxxxxx
status: succeeded
parameters: None
result: 
  exit_code: 0
  result:
  - Reservations:
    - Groups: []
      Instances:
      - AmiLaunchIndex: 0
        Architecture: x86_64
        BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            AttachTime: '2018-03-12T13:22:08+00:00'
            DeleteOnTermination: true
            Status: attached
            VolumeId: vol-xxx
        ClientToken: 'xxx'
        EbsOptimized: false
        EnaSupport: false
        Hypervisor: xen
        ImageId: ami-77152012
        InstanceId: i-xxx
        InstanceType: t2.medium
        KeyName: xxx
        LaunchTime: '2018-03-20T00:29:23+00:00'
        Monitoring:
          State: disabled
        NetworkInterfaces:
        - Attachment:
            AttachTime: '2018-03-12T13:22:07+00:00'
            AttachmentId: eni-attach-xxx
            DeleteOnTermination: true
            DeviceIndex: 0
            Status: attached
          Description: ''
          Groups:
          - GroupId: sg-xxx
            GroupName: Cisco Cloud Services Router -CSR- 1000V - AX Pkg- Max Performance-16-7-1-AutogenByAWSMP-
          Ipv6Addresses: []
          MacAddress: 02:30:07:xx:xx:xx
          NetworkInterfaceId: eni-xxx
          OwnerId: xxx
          PrivateDnsName: ip-172-31-6-206.us-east-2.compute.internal
          PrivateIpAddress: 172.31.6.206
          PrivateIpAddresses:
          - Primary: true
            PrivateDnsName: ip-172-31-6-206.us-east-2.compute.internal
            PrivateIpAddress: 172.31.6.206
          SourceDestCheck: true
          Status: in-use
          SubnetId: subnet-xxx
          VpcId: vpc-xxx
        Placement:
          AvailabilityZone: us-east-2a
          GroupName: ''
          Tenancy: default
        PrivateDnsName: ip-172-31-6-206.us-east-2.compute.internal
        PrivateIpAddress: 172.31.6.206
        ProductCodes:
        - ProductCodeId: xxx
          ProductCodeType: marketplace
        PublicDnsName: ''
        RootDeviceName: /dev/xvda
        RootDeviceType: ebs
        SecurityGroups:
        - GroupId: sg-xxx
          GroupName: Cisco Cloud Services Router -CSR- 1000V - AX Pkg- Max Performance-16-7-1-AutogenByAWSMP-
        SourceDestCheck: true
        State:
          Code: 80
          Name: stopped
        StateReason:
          Code: Client.UserInitiatedShutdown
          Message: 'Client.UserInitiatedShutdown: User initiated shutdown'
        StateTransitionReason: User initiated (2018-03-20 00:58:19 GMT)
        SubnetId: subnet-xxx
        Tags:
        - Key: Name
          Value: xxx
        VirtualizationType: hvm
        VpcId: vpc-xxx
      OwnerId: xxx
      ReservationId: rxxx

    (略) 2つめ以降のインスタンス情報が続く

    ResponseMetadata:
      HTTPHeaders:
        content-type: text/xml;charset=UTF-8
        date: Tue, 20 Mar 2018 14:38:03 GMT
        server: AmazonEC2
        transfer-encoding: chunked
        vary: Accept-Encoding
      HTTPStatusCode: 200
      RequestId: xxx-xxx-xxx-xxx
      RetryAttempts: 0
  stderr: ''
  stdout: ''

実行中の EC2 インスタンスのみ

実行中(instance-state-namerunning)のインスタンスの情報を取得する場合は、以下のようなコマンドを実行します。

・実行コマンド

st2 run aws.ec2_describe_instances Filters='[{"Name":"instance-state-name","Values":["running"]}]'

その他のフィルタ

その他のフィルタについては、以下のコマンドを実行して確認します。

st2 action get aws.ec2_describe_instances 

(抜粋)

|     "Filters": {                                             |
|         "type": "array",                                     |
|         "description": "One or more filters.    affinity -   |
| The affinity setting for an instance running on a Dedicated  |
| Host (default | host).    architecture - The instance        |
| architecture (i386 | x86_64).    association.public-ip - The |
| address of the Elastic IP address (IPv4) bound to the        |
| network interface.    association.ip-owner-id - The owner of |
| the Elastic IP address (IPv4) associated with the network    |
| interface.    association.allocation-id - The allocation ID  |
| returned when you allocated the Elastic IP address (IPv4)    |
| for your network interface.    association.association-id -  |
| The association ID returned when the network interface was   |
| associated with an IPv4 address.    availability-zone - The  |
| Availability Zone of the instance.    block-device-mapping   |
| .attach-time - The attach time for an EBS volume mapped to   |
| the instance, for example, 2010-09-15T17:15:20.000Z.         |

例えば、インスタンスID i-dummy1i-dummy2 の情報を取得る場合は、以下のようなコマンドを実行します。

st2 run aws.ec2_describe_instances Filters='[{"Name":"instance-id", "Values":["i-dummy1", "i-dummy2"]}]'

JSON 形式で出力する

-j オプションを使用すると、JSON形式で出力できます。

・コマンド実行例(Fitlers などの他のオプションとも併用可)

st2 run aws.ec2_describe_instances -j


■ まとめ

StackStorm で EC2 インスタンスの情報を取得することができました。

aws pack ではほかにも様々な機能があります。 aciont の一覧は st2 action list -p aws で確認することができます。 今回は、手動でのコマンド実行で操作しましたが、StackStormが持つイベントドリブンな仕組みを活用することで、利用用途が広がると思います。

「カイゼン・ジャーニー」で学んだチームビルディングで大切にしたいこと

■ はじめに

カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで』という本を読みました。 www.shoeisha.co.jp

本書は開発の現場において、アジャイル開発のプラクティスをベースに改善していく物語と解説なのですが、私はチームビルディングの物語として読みました。 読み終わった後も、チームビルディングの物語として解釈しました。 本書で学んだことをまとめたいと思います。


■ なぜチームビルディングの物語と解釈したか

理由は第12話で出てきます。第12話では「組織の成功循環モデル」がというモデルが紹介されています。 行動の質は、思考の質によって決まり、思考の質は関係の質によってきまる。というようなことを示すモデルです。

f:id:akira6592:20180318000342p:plain

関係の質こそがすべての起点となり、関係の質を上げるためにチームビルディングが必要な要素だと考えました。


■ 大切にしたい3つのこと

個人的な拡大解釈も含みますが、チームビルディングにおいて大切にしたいと感じたのは以下の3つです。

  • 自分から始める
  • 心理的安全性を確保する
  • HRT(謙虚:Humility、尊敬:Respect、信頼:Trust) を大切にする

これらを大切にすることで、本書に出てくる様々なプラクティスも活かされるのだと思います。

例えば、第1話の解説にある、他社のやり方をそのまま持ち込まず、自分たちの状況、制約の下でどうするべきか捉えなおさないといけないという件。 「自分」ではなく「自分たち」です。自分たちの状況を知るためには、周囲の人の本音を聞く必要もあります。 周囲の人が本音を話してくれるような良好な関係を保つためにはHRTの精神が必要ですし、本音を言ってもよいと安心してもらうために心理的安全性を確保する必要があります。

また、(どのページに書いてあるか失念してしまいましたが)案外他の人も改善したがっているという件。 協力者を得るためには、自分から動き、周囲の人の本音を聞く必要があります。

      f:id:akira6592:20180318000522p:plain


トークイベントにも参加しました

2018/03/15 ジュンク堂池袋本店で開催された刊行記念トークイベントにも参加させていただきました。 著者の市谷聡啓さん、新井剛さん、ゲストの角谷信太郎さん、及部敬雄さんがいらっしゃいました。

みなさんのアツいお話がたくさん聞けました。 市谷さんがイベントで使用された資料がありましたので掲載します。

www.slideshare.net

・公式サイトによるレポート(2018/03/19追記) kaizenjourney.jp

・一谷さんによるレポート(2018/03/19追記) papanda.hatenablog.com

細かいところですが「バリューストリームマップは、(単なるアウトプットではなく)みんなで一緒にプロセスを整理するためのコミュニケーションツール」とおっしゃっていたことが印象に残っています。


■ さいごに

純粋にやってみたいと思ったプラクティスは、モブプログラミング(モブワーク)と、期待をすり合わせるドラッカー風エクササイズです。 ですが、これらをやって意味のある関係性であり続けることや、目的・理由をはっきり持ち続けることも忘れずにいたいと思います。 本書やイベントでいただいた勇気を燃料にして、私もジャーニーしたいと思います。

Ansible で StackStorm をインストールする

■ はじめに

イベントドリブンな自動化ツール StackStorm の公式ドキュメントに、Ansibleでのインストール方法が記載されていたので、試してみます。

・ドキュメント

https://docs.stackstorm.com/install/ansible.html

・Playbook

github.com

■ 環境

インストール先

あまり低スペックだと、インストールの途中で何かしらのタイムアウトで失敗しています。例えば、 AWSt2.micro ではうまくインストールできませんでした。 t2.medium は安定してインストールできました。 システム要件は以下のページで確認できます。

https://docs.stackstorm.com/install/system_requirements.html

Ansibleホスト側

Ansible 2.4.2 を利用しました。特に理由はないですが、今回は Azure Cloud Shell にあらかじめインストールされている Ansible を利用しました。


■ 準備

Playbook

前述のPlaybookをclone しておきます。

git clone https://github.com/StackStorm/ansible-st2.git
cd ansible-st2

その他

inventory ファイル、認証情報などを準備しておきます。


■ 実行

・コマンド

ansible-playbook stackstorm.yml -i 'localhost,' --connection=local

・ログ(抜粋)

[DEPRECATION WARNING]: The use of 'include' for tasks has been deprecated. Use 'import_tasks' for static inclusions or 'include_tasks' for
dynamic inclusions. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: include is kept for backwards compatibility but usage is discouraged. The module documentation details page may
explain more about this rationale.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.

PLAY [Install st2] *************************************************************************************************************************

(略)

changed: [18.217.xxx.xxx] => (item=^(export ST2_AUTH_PASSWORD.*))

TASK [st2chatops : Check if any adapter is enabled] ****************************************************************************************
fatal: [18.217.xxx.xxx]: FAILED! => {"changed": false, "cmd": ["grep", "-e", "^export HUBOT_ADAPTER=", "/opt/stackstorm/chatops/st2chatops.env"], "delta": "0:00:00.002958", "end": "2018-03-12 00:51:45.973120", "msg": "non-zero return code", "rc": 1, "start": "2018-03-12 00:51:45.970162", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [st2chatops : Set variable enabled_adapter] *******************************************************************************************
fatal: [18.217.xxx.xxx]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: list object has no element 1\n\nThe error appears to have been in '/home/yokochi1983/ansible-st2/roles/st2chatops/tasks/main.yml': line 118, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Set variable enabled_adapter\n  ^ here\n\nexception type: <class 'ansible.errors.AnsibleUndefinedVariable'>\nexception: list object has no element 1"}
...ignoring

(略)

TASK [st2chatops : Comment existing hubot adapters in "/opt/stackstorm/chatops/st2chatops.env"] ********************************************
ok: [18.217.xxx.xxx]


PLAY RECAP *********************************************************************************************************************************
18.xx.xx.xx             : ok=96   changed=68   unreachable=0    failed=0

書き方が少し古いようで WARNING が出ました。 また、二つほどタスクがコケましたが、 ignore_errors: true 扱いのようです。


■ 確認

CLI

インストール先にログインし、以下のようにバージョンや簡単な動作確認をします。 なお、ユーザー名とパスワードは、roles/st2/defaults/main.yml で定義したものになります。特にカスタマイズしていない場合は以下のようになります。

  • ユーザー名: testu
  • パスワード: testp
[ec2-user@ip-172-31-2-121 ~]$ st2 --version
st2 2.6.0
[ec2-user@ip-172-31-2-121 ~]$ export ST2_AUTH_TOKEN=`st2 auth -t -p 'testp' testu`
[ec2-user@ip-172-31-2-121 ~]$ st2 run core.local -- date -R
.
id: 5aa5e69cfbe28846c0b28881
status: succeeded
parameters:
  cmd: date -R
result:
  failed: false
  return_code: 0
  stderr: ''
  stdout: Mon, 12 Mar 2018 02:31:57 +0000
  succeeded: true
[ec2-user@ip-172-31-2-121 ~]$

StackStorm 経由でローカルに対して date コマンドが実行できたことを確認できました。

Web UI

https://<インストール先IPアドレス> でブラウザでアクセスします。 f:id:akira6592:20180312114025p:plain

前述のユーザー名とパスワードでログインします。ちょうど先ほどCLIで試したときのログがHISTORYに表示されていることが確認できました。 f:id:akira6592:20180312114231p:plain


■ まとめ

Ansible で StackStorm をインストールできることが確認できました。 他にもワンライナーでインストールしたり、Docker、Vagrant など様々な方法でのインストール方法がありますでの、詳細は、以下の公式ドキュメントをご参照ください。

https://docs.stackstorm.com/install/index.html

参考:VagrantVM ごと準備する場合

tekunabe.hatenablog.jp

Ansible の panos_object モジュール使用時のエラー「Missing required libraries.」の対策

■ はじめに

Ansible には PaloAlto (PAN-OS) 用のモジュールがいくつかあります。これらのモジュールを利用するにあたって、別途Pythonライブラリが必要なものもあります。 たとえば、 アドレスやサービスオブジェクトを操作する panos_object モジュール の公式ドキュメントには以下の2つのPythonライブラリが必要(Requirements)という記述があります。

ところが私の環境(Centos 7.4、Ansible 2.4.3、Python 2.7.5)では、それでもまだライブラリが足りないというエラーが発生したので、その詳細と対策を記載します。


■ 実行エラー内容

panos_object モジュールの公式ドキュメントのサンプルにある、サービスオブジェクトを追加する Playbook を実行したところ、以下のエラーになりました。

TASK [create a global service for TCP 3306] ***********************************************************
fatal: [192.168.1.15]: FAILED! => {"changed": false, "msg": "Missing required libraries."}


■ 対策

結論としては、 xmltodict を追加でインストールすることで処理を正常に実行することができました。

準備

pip install xmltodict

実行

[vagrant@centos7 vagrant]$ ansible-playbook -i inventory p25.yml

PLAY [panos] *******************************************************************

TASK [create a global service for TCP 3306] ************************************
changed: [192.168.1.15]

PLAY RECAP *********************************************************************
192.168.1.15               : ok=1    changed=1    unreachable=0    failed=0


■ 補足:調べ方

エラーメッセージの Missing required libraries. をヒントにして、panos_object モジュールのコードを調べました。 エラーメッセージを設定している箇所がこちらでした。

遡ってみると、以下のimport に失敗したときにエラーが表示されることが分かりました。

    import pan.xapi
    from pan.xapi import PanXapiError
    import pandevice
    from pandevice import base
    from pandevice import firewall
    from pandevice import panorama
    from pandevice import objects
    import xmltodict
    import json

ここに import xmltodict とあるのに対して、私の環境には xmltodict がなかったのでインストールしました。

SRE-SET Automation Night #2 で「Ansible 2.5 におけるネットワークモジュールのトピック」という発表をしてきました

f:id:akira6592:20180309181453j:plain

2018/03/06 に メルカリさん主催の「SRE-SET Automation Night #2」という自動化に関する勉強会が開催され、参加と登壇させていただきました。

mercari.connpass.com


■ Ansible 2.5 におけるネットワークモジュールのトピック

www.slideshare.net

2018年3月中に正式リリース予定の Ansible 2.5 でネットワークモジュール周りで変更点がいくつかあります。現在のバージョン rc1 なので、少し早めに共有したいと思い、時間を頂戴しました。

資料中にでてくるリンクを本記事にも引用します。

CHANGELOG

github.com

公式ドキュメント: Ansible for Network Automation

Ansible for Network Automation — Ansible Documentation

Porting Guide

Ansible 2.5 Porting Guide — Ansible Documentation

公式ブログ: COMING SOON: NETWORKING FEATURES IN ANSIBLE 2.5

www.ansible.com



■ 他の発表の資料

mercari.connpass.com


■ まとめブログ

blog.jicoman.info kesin.hatenablog.com

感想など

普段、automation、自動化といったキーワードで参加しているイベントの参加者と違って、フロントエンジニアの方が多かった印象です。 Ansible は知っていても、利用はされていなかったり、ネットワークに対応していることをご存じなかった方もいらっしゃったようなので、知っていただくきっかけにはなったかなと思います。 みなさんの発表を聞いて、開発では様々な工夫をされているのだなと感じました。

今回は、発表の機会を頂戴しましてまことにありがとうございました。

オープンソースカンファレンス 2018 Tokyo/Spring に参加してきました

はじめに

いつか行きたいと思っていてようやく行けたイベントシリーズ。

に続いて、 オープンソースカンファレンス(OSC)に参加してきました。 私が参加したセッションのメモを簡単ですがまとめたいと思います。

www.ospn.jp


■ ついにL3スイッチ機能が搭載された,日本発のオープンソースソフトウェアスイッチOS「Lagopus Switch」

www.ospn.jp

Lagopus Switch は聞いたことはあったのですが、Lagopus Router という存在を初めて知りました。 現状、紹介されていたユースケースを身近に当てはめられることはありませんが、今後何か細かいことをしなくてはいけない時に、かゆいところに届くこのようなモノがあることは覚えておこうと思います。

また、Zebra 2.0 や openconfigd のくだりで、大変興味深い資料が紹介されていました。

www.slideshare.net

  • 参考: OSC 2018 大阪での同タイトルセッションのtogetter togetter.com


■ 【入門】Docker入門

www.ospn.jp

www.slideshare.net

あまり Docker を触ったことがなかったので参加しました。個人的には attachとexecの違いの説明が助かりました。


LAMPもDockerもKubernetesも数クリックでデプロイ! Nutanix & Calmによるインフラとアプリケーション展開の自動化

www.ospn.jp

www.slideshare.net

Nutanix は、どちらかというとアプライアンス寄りのベンダーというイメージがあったのですが、今回でソフトウェアのベンダーという印象に変わりました。 また、 Nutanix Calm を初めて知り、ずいぶん範囲を広げてきているんだなと思いました。


オープンソースのコンテナ管理プラットフォーム "Rancher" のご紹介

www.ospn.jp

www.slideshare.net

Rancherは名前しか聞いたことがなかったのですが、ほかのコンテナ周辺のツールとの関係、Rancher 1.0 と 2.0 の大きな違いなどを知れました。 また、Rancher 2.0 が オーケストレータを kubernetes 1本に絞った経緯が大変興味深かったです。


おわりに

初参加でしたが、いろいろ目移りしてしまうセッションがあって楽しめました。 また、twitter でやり取りさせていただいている皆様ともご挨拶ができました。 次回もまた参加させていただきたいと思います。

Ansible の Playbook Debugger を常に起動させる方法(Ansible 2.5 から)

■ はじめに

Ansible には Playbook Debugger というPlaybook の実行を途中で止めて、変数の内容を表紙したり変更したりできる機能があります。 これまでは、エラー発生時のみ Debugger を起動させることできたのですが、次期バージョン Ansible 2.5 から、オプションの指定次第で常に Debugger を起動させることができるようになります。

本記事では、Playbookの書き方と動作イメージについてご紹介します。

なお、ansible-playbook コマンドの --step オプションとは別のものです。


■ 環境

インストール

記事執筆時点では 2.5 は beta2 となっています。 ここでは pip で以下のようにインストールします。

pip install git+https://github.com/ansible/ansible.git@stable-2.5

バージョン確認

バージョンが 2.5系 になっていることを確認します。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook --version
ansible-playbook 2.5.0b2
  config file = /etc/ansible/ansible.cfg
  (略)


■ お試し

Playbook

以下のような Playbook で試します。 ポイントは以下の2箇所です。

  • strategy: debug 今までも利用できた Playbook Debugger を適用するための指定です
  • debugger: always 2.5 から利用可能な、Debugger を起動させる条件の指定です。alyways で常に起動。
- hosts: junos
  gather_facts: no
  strategy: debug      # point1
  debugger: always     # point2

  tasks:
    - name: task1
      junos_facts:

    - name: task2
      junos_command:
        commands:
          - show version

(インベントリファイル、varsファイルは省略します)

実行結果

(1) 通常通り ansible-playbook コマンドで実行します。

(ansible25) [vagrant@centos7 vagrant]$ ansible-playbook -i inventory test.yml

PLAY [junos] ****************************************************************

TASK [task1] ****************************************************************
ok: [172.16.0.1]
[172.16.0.1] TASK: task1 (debug)>

このように Debugger が起動し、入力待ち状態になります。

(2) h でヘルプを表示します。

[172.16.0.1] TASK: task1 (debug)> h

Documented commands (type help <topic>):
========================================
EOF  c  continue  h  help  p  pprint  q  quit  r  redo

[172.16.0.1] TASK: task1 (debug)>

このように 入力オプションが表示されます。

(3) c で処理を続けます。

[172.16.0.1] TASK: task1 (debug)> c

TASK [task2] *****************************************************************
ok: [172.16.0.1]
[172.16.0.1] TASK: task2 (debug)>

このように、 task2 が実行され、入力待ち状態になります。

(4) p でタスク実行結果の内容を表示させます。

[172.16.0.1] TASK: task2 (debug)> p result._result
{'_ansible_no_log': False,
 '_ansible_parsed': True,
 u'changed': False,
 'failed': False,
 u'invocation': {u'module_args': {u'commands': [u'show version'],
                                  u'display': None,
                                  u'host': None,
                                  u'interval': 1,
                                  u'match': u'all',
                                  u'password': None,
                                  u'port': None,
                                  u'provider': None,
                                  u'retries': 10,
                                  u'rpcs': None,
                                  u'ssh_keyfile': None,
                                  u'timeout': None,
                                  u'transport': None,
                                  u'username': None,
                                  u'wait_for': None}},
 u'stdout': [u'Hostname: vsrx1\nModel: firefly-perimeter\nJUNOS Software Release [12.1X47-D15.4]'],
 u'stdout_lines': [[u'Hostname: vsrx1',
                    u'Model: firefly-perimeter',
                    u'JUNOS Software Release [12.1X47-D15.4]']]}
[172.16.0.1] TASK: task2 (debug)> 

このように、p result._result で、タスク実行結果の各変数が表示されます。 Playbook の中で特に register で明示的に変数に代入していないのもポイントです。 その他、Playbook Debbuger の詳細は使用方法は、公式ドキュメントの「Playbook Debugger」ページをご参照ください。

(5) c で処理を続けます。

[172.16.0.1] TASK: task2 (debug)> c

PLAY RECAP *******************************************************************
172.16.0.1                 : ok=2    changed=0    unreachable=0    failed=0

(ansible25) [vagrant@centos7 vagrant]$

すべてのタスクが終了します。

デモ動画

先ほどの実行結果の動画版です。

f:id:akira6592:20180220180655g:plain


■ まとめ

エラー時だけでなく、通常時も Debbuger を起動できるようになり、Playbook の開発、デバッグが捗りそうです。

・参考記事

tekunabe.hatenablog.jp