書評『PowerShell実践ガイドブック クロスプラットフォーム対応の次世代シェルを徹底解説』

 


 

PowerShellやDSCの最新情報についていつも参考にさせていただいている
@guitarrapc_techさんが本を出版されたとのことで、
これは買わねばなるまいと思っていました。

そんな時、マイナビ出版さんが先行レビューの希望者を募集されていましたので、
イチかバチかで申し込んでみたところ、
ご恵贈いただきました。

マイナビ出版さん、ありがとうございましたm(__)m

 

わたしの周辺のPowerShell事情

 
ここ数年、仕事ではもはやクラウド(主にAWS)関連のコンサルやデリバリーばかりやっています。
Serverless、Container等の新しい潮流は増えてきているものの、
わたしがビジネスを行っているエンタープライズ領域のシステム開発では、
未だWindowsやLinuxを利用するIaaSの活用が主流です。

当然ながら、ビジネスのバックエンドで動くシステムでは運用を自動化します。
AWSならLambdaのcronライクな機能を使って運用タスクのスケジューリングを行うこともできますが、
エンタープライズ領域ではオンプレミスに構築された統合ジョブ実行基盤(JP1、Systemwalker、WebSAM、Senju等)や、
クラウド上に構築したジョブ実行基盤を利用して運用タスクの自動化を行うケースがほとんどです。

運用タスクを自動化するスクリプトは、Linux環境であればbashやPythonが多いのですが、
Windows環境は近年やはりPowerShellがメインになってきています。

 
PowerShellが出始めた頃(2006年頃)は、どうもあのコマンドレットというものの羅列に馴染めず、
WSHやコマンドプロンプト(.bat)で十分、と思っていた時期が私にもありました。

が、Infrastructure as Codeが流行りだし、CloudFormationやAnsibleの勉強をする中で、
PowerShell DSCというものに出会い、少しずつPowerShellに触れるようになってきました。

慣れてくると、WSHや.batよりも、PowerShellの方がコードがすっきりしますし、
例外処理やOSの機能を活用するような処理もやりやすいですね。

現在、AWSのEC2上で運用スクリプトを書く場合は、PowerShellでAWS CLIをラップして
作成しています。
AWSでWindowsインスタンスを起動すると、AWS Tools for Windows PowerShellがプレインストールされているのですが、
敢えてAWS CLIをインストールしています。

理由としては、AWS CLIであればWindows環境で作成した運用スクリプトのAWS CLI部分を
Linux環境に移植しやすいですし、
AWS CLIであれば、S3とEC2間のファイル転送時に最大同時リクエスト数やマルチパート処理が採用されるファイルサイズの閾値(デフォルト5GB)を変更できるからです。
(AWS Tools for Windows PowerShellではまだそこまで細かい制御はできない・・はず)

AWS CLI S3 Configuration — AWS CLI 1.15.28 Command Reference

 
そんなわけで、Windows環境の運用スクリプトはPowerShellで統一しているわけですが、
クラウドチームの若者たちは、かつてのわたしがそうだったように、
どうも始めはPowerShellに抵抗があるようです。

 
そんな時におすすめの一冊が、本書『PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~』だと思います。

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~
吉崎 生
マイナビ出版 (2018-05-30)
売り上げランキング: 14,584

 

なぜ若者におすすめか

 
先ず、本書は1章で「ファイルのリネーム」であったり、「Webサイトのヘルスチェック」のような
PowerShellを使った便利機能の紹介から始まります。
サンプルを写経することで、とりあえず動かして「おお!」という感動を得られる点がよいです。

通常の言語本では、基本的なシンタックスや変数の定義等の文法の説明から入りますが、
そういうのは2章以降、豊富なサンプルと一緒に解説されますので、
読み始めでいきなり挫折、という悲劇を回避できます。

 
また、PowerShellの機能が網羅的に説明されている一方、
5章では「実世界のPowerShell」として、
PowerShellでハマりやすいポイントについて事例が紹介されており参考になりますし、
AWS、Azure、GCPといったクラウド対応や、DSCについての記述もあり
PowerShellの運用スクリプト以外の使い方についても学べるところが良いですね。
リファレンスとして身近に置いておきたい一冊です。

クラウドの中でも、AzureについてはGUIがイケてないPowerShellの方が操作がしやすい、というのもあります。
AzureのPowerShellツールは現状クラシックなASMと最新のARMが混在している状況でちょっとわかりづらいところもありますが、
Azureの認定試験でも頻出問題でもありますし、また実際の運用でも多用しますので、
AWSとAzureのマルチクラウドエンジニアを目指すのであれば、PowerShellは必須スキルと言えます。

 

というわけで

 
PowerShellをこれから学びたいという方に、
雰囲気で使っているのできちんと学びなおしたい方にも、
本書は大いにおすすめできます。

恥ずかしながら、PowerShell6.0と、現行のWindows Server 2016で既定のPowerShell5.1には
大きな違いがあるということを、本書を読んで初めて知りました。
そのあたりについてもPowerShellの歴史と共に詳しく記述されていますので、
ぜひ読んでみて下さい。

 
なお、本書のページ数は600ページ、厚さにする3.5cmとかなり鈍器感ありますので、
通勤のお供にされる方は電子書籍版やPDF版もどうぞ!!!

Amazon Linuxでserverspec-initができない(`require’: cannot load such file — io/console (LoadError))

 


 

Amazon Linuxでserverspecのインストールはできるが、

serverspec-initができない。

Amazon LinuxのAMI IDはamzn-ami-hvm-2017.03.0.20170417-x86_64-gp2 (ami-923d12f5)、

Rubyのバージョンはruby 2.0.0p648 (2015-12-16) [x86_64-linux]、

rakeのバージョンはrake, version 12.0.0。

 
serverspec-initを実行すると、


[ec2-user@ip-192-168-11-11 serverspec]$ serverspec-init
/usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- io/console (LoadError)
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/net-ssh-4.1.0/lib/net/ssh/prompt.rb:1:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/net-ssh-4.1.0/lib/net/ssh/key_factory.rb:2:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/net-ssh-4.1.0/lib/net/ssh/authentication/key_manager.rb:2:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/net-ssh-4.1.0/lib/net/ssh/authentication/session.rb:4:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/net-ssh-4.1.0/lib/net/ssh.rb:12:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/specinfra-2.67.9/lib/specinfra/backend/ssh.rb:3:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/specinfra-2.67.9/lib/specinfra/backend.rb:3:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/specinfra-2.67.9/lib/specinfra/core.rb:7:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/specinfra-2.67.9/lib/specinfra.rb:1:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/serverspec-2.38.0/lib/serverspec.rb:2:in `'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/ec2-user/.gem/ruby/2.0/gems/serverspec-2.38.0/bin/serverspec-init:5:in `'
from /home/ec2-user/bin/serverspec-init:23:in `load'
from /home/ec2-user/bin/serverspec-init:23:in `

'

となる。

ログを見て、ああ、io-consoleがないのね、と思い、gem install io-console するが、


[ec2-user@ip-192-168-11-11 serverspec]$ gem install io-console
Fetching: io-console-0.4.6.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing io-console:
ERROR: Failed to build gem native extension.

/usr/bin/ruby2.0 extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h

Gem files will remain installed in /home/ec2-user/.gem/ruby/2.0/gems/io-console-0.4.6 for inspection.

となる。

むむーーーーーー

ヘッダーファイルがみつからない的なエラーが出ているため、

sudo yum -y install ruby-devel

したが変わらず。

それではということで、

sudo yum install -y ruby20-devel gcc-c++

したらio-consoleインストールできた!!!!!!!!!

 
というわけで、無事serverspec-initもできた。

最近のAmazon LinuxのRubyだと起きる・・?
 

awspecでspecファイルをgenerateすると(中略)awsecrets-1.10.1/lib/awsecrets.rb:59:in `exist?’: no implicit conversion of nil into String (TypeError)

 


 

Infrastructure as codeである。

 
「エンタープライズにAWS?早い早い」などという担当者の方の冷笑はいまや昔。

今日ではあの三菱東京UFJ銀行までがAWSを利用しようかというご時勢である。

そんな時流に乗り、弊社も忙しい。とっても忙しい。

手のぬくもりを大切にした環境構築ではもはや追いつかない。

そこで自動化を推進するわけである。

Terraformは以前からちょいちょい触っていたが、インフラ構築にもTDDをということで、

awsspecを検証してみた。

 
Amazon Linuxに2.x系のRubyを入れ(詳細は割愛する)、


gem install awspec
mkdir awspec
cd awspec
awspec init

ここまでは順調。

問題はこの後、


echo "require 'spec_helper'" > spec/ec2_and_rds_spec.rb
awspec generate vpc vpc-xxxxxxxxxc >> spec/ec2_and_rds_spec.rb

しようとすると、


$ awspec generate vpc vpc-1871177c >> spec/ec2_and_rds_spec.rb
/home/ec2-user/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/awsecrets-1.10.1/lib/awsecrets.rb:59:in `exist?': no implicit conversion of nil into String (TypeError)

というエラーが出る。

 
“secrets”とあるからてっきりaws configure関連かと思ったが、実行しても変わりはない。

こんな時は公式サイトを見るのだ。

 
結局、

・specディレクトリの下にsecrets.ymlを作成

$ cat <<EOF > spec/secrets.yml
region: ap-northeast-1
aws_access_key_id: XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
EOF

awsecretsをインストールする

$ gem install awsecrets

とやったところ、specファイルが生成され、自動テストが実行できるようになった。

 
パラメータシートとにらめっこして画面ショットを取るのもせつないので、

うまく活用していきたい。

 

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス
Kief Morris
オライリージャパン
売り上げランキング: 9,259