Slide 1

Slide 1 text

Inside  of  awspec Kenʼ’ichiro  Oyama Fusic  Co.,Ltd. 2016.6.11 1 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 2

Slide 2 text

Who 2 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 3

Slide 3 text

k1LoW   Kenʼ’ichiro  Oyama   @k1LoW   Fusic  Co.,Ltd.  エンジニア   CakePHP/AWS/さくらVPS   GitHub  organizations   fukuokarb  /  dotcake  /  emacs-‐‑‒jp  /  etc.   好きなAWSサービス 3 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 4

Slide 4 text

4 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 5

Slide 5 text

awspec •  AWSリソースの構成テストツール •  http://github.com/k1LoW/awspec •  構築したAWSリソースをRSpecなDSLでテストが可能 5 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 6

Slide 6 text

ec2  describe ec2('my-ec2-tag-name') do   it { should be_running }   its(:instance_id) { should eq 'i-ec12345a' }   its(:instance_type) { should eq ’t2.small' }   its(:public_ip_address) { should eq '123.0.456.789' }   it { should have_security_group('my-sg-name') }   it { should belong_to_vpc('my-vpc') }   it { should belong_to_subnet('subnet-1234a567') }   it { should have_eip('123.0.456.789') }   it { should be_disabled_api_termination }  end 6 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 7

Slide 7 text

route53_̲hosted_̲zone  describe route53_hosted_zone('example.com.') do   it { should exist }   its(:resource_record_set_count) { should eq 5 }   it { should have_record_set('example.com.').a('123.456.7.890') }   it { should have_record_set('example.com.').mx('10 mail.example.com') }   it { should have_record_set('mail.example.com.').a('123.456.7.890').ttl(3600) }   ns = 'ns-123.awsdns-45.net.  ns-6789.awsdns-01.org.  ns-2345.awsdns-67.co.uk.  ns-890.awsdns-12.com.'   it { should have_record_set('example.com.').ns(ns) }   it { should have_record_set('s3.example.com.').alias('s3-website-us- east-1.amazonaws.com.', 'Z2ABCDEFGHIJKL') }  end 7 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 8

Slide 8 text

Resource  Types  (v.0.40.0) •  ami •  autoscaling_̲group •  cloudwatch_̲alarm •  directconnect_̲virtual_̲i nterface •  ebs •  ec2 •  elasticache •  elasticache_̲cache_̲para meter_̲group •  elb •  iam_̲group •  iam_̲policy •  iam_̲role •  iam_̲user •  lambda •  launch_̲configuration •  nat_̲gateway •  network_̲acl •  network_̲interface •  rds •  rds_̲db_̲parameter_̲gro up •  route53_̲hosted_̲zone •  route_̲table •  s3_̲bucket •  security_̲group •  ses_̲identity •  subnet •  vpc •  cloudfront_̲distribution 8 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 9

Slide 9 text

has  28  resource  types 9 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 10

Slide 10 text

awspec  generate  ~ > awspec generate   awspec generate cloudwatch_alarm # Generate cloudwatch_alarm spec   awspec generate directconnect # Generate directconnect spec   awspec generate ebs # Generate attached ebs spec   awspec generate ec2 [vpc_id] # Generate ec2 spec from VPC ID (or VPC "Name" tag)   awspec generate elb [vpc_id] # Generate elb spec from VPC ID (or VPC "Name" tag)   awspec generate help [COMMAND] # Describe subcommands or one specific subcommand   awspec generate iam_group # Generate iam_group spec   awspec generate iam_policy # Generate attached iam_policy spec   awspec generate iam_role # Generate iam_role spec   awspec generate iam_user # Generate iam_user spec   awspec generate lambda # Generate lambda spec   awspec generate nat_gateway [vpc_id] # Generate nat_gateway spec from VPC ID (or VPC "Name" tag)   awspec generate network_acl [vpc_id] # Generate network_acl spec from VPC ID (or VPC "Name" tag)   awspec generate network_interface [vpc_id] # Generate network_interface spec from VPC ID (or VPC "Name" tag)   awspec generate rds [vpc_id] # Generate rds spec from VPC ID (or VPC "Name" tag)   awspec generate route53_hosted_zone [example.com.] # Generate route53_hosted_zone spec from Domain name   awspec generate route_table [vpc_id] # Generate route_table spec from VPC ID (or VPC "Name" tag)   awspec generate s3_bucket [backet_name] # Generate s3_bucket spec from S3 bucket name. if NO args, Generate all.   awspec generate security_group [vpc_id] # Generate security_group spec from VPC ID (or VPC "Name" tag)   awspec generate subnet [vpc_id] # Generate subnet spec from VPC ID (or VPC "Name" tag)   awspec generate vpc [vpc_id] # Generate vpc spec from VPC ID (or VPC "Name" tag) 10 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 11

Slide 11 text

can  generate  20  type  spec 11 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 12

Slide 12 text

Inside  of  awspec 12 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 13

Slide 13 text

13 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 14

Slide 14 text

awspec  written  by  Ruby •  aws-‐‑‒sdk-‐‑‒rubyの開発が活発だった •  re:Invent中の発表とSDKの新機能リリースがほぼリアル タイム •  Serverspecの良良さを感じていた •  Serverspec本も相当勉強になる •  同じようなDSLでテストをしたかった •  Fukuoka.rbがあった •  事実、内部実装でかなり助けてもらった •  http://k1low.hatenablog.com/entry/2015/12/11/185728 •  (本⼈人は忘れているだろうけど)udzuraさんはawspecのコミッ ト権を持っている 14 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 15

Slide 15 text

tree  -‐‑‒d  awspec/ !"" bin !"" doc # $"" _resource_types !"" exe !"" lib # $"" awspec # !"" command # !"" ext # !"" generator # # !"" doc # # # $"" type # # $"" spec # !"" helper # # $"" finder # !"" matcher # !"" stub # $"" type $"" spec 15

Slide 16

Slide 16 text

awspec  toolbox 16 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 17

Slide 17 text

bundle  exec  bin/toolbox  template  ec2 17 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 18

Slide 18 text

bundle  exec  bin/toolbox  template   •  awspecに新しいリソースタイプを追加するときに利利⽤用 するコマンド •  $  bundle  exec  bin/toolbox  template  redshift •  リソースタイプ作成に最低限必要なファイルが⽣生成される •  ⽣生成されたファイルを他のリソースタイプの書き⽅方をマネて 修正すればだいたいOK 18 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 19

Slide 19 text

bundle  exec  bin/toolbox  docgen 19 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 20

Slide 20 text

bundle  exec  bin/toolbox  docgen •  awspecのソースコードからドキュメントを作成するコ マンド •  awspecはドキュメントジェネレータまで内包している っ!! •  Awspec::Generator::Doc::Type:* •  doc/_̲resource_̲types/*.md •  ドキュメントをプログラムで⽣生成することでaws-‐‑‒sdk-‐‑‒ rubyのリリーススピードについていく 20 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 21

Slide 21 text

つまり 21 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 22

Slide 22 text

I  want  your  contribution!! 22 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 23

Slide 23 text

aws-‐‑‒sdk-‐‑‒ruby 23 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 24

Slide 24 text

aws-‐‑‒sdk-‐‑‒ruby •  リソースを操作するクラスは、以下の2種類 •  Seahorse::Client::Baseを継承したAws::*::Client •  (Aws::EC2::Clientなど) •  Resources::Resourceを継承したAws::*::Somename •  (Aws::EC2::Instanceなど) •  Clientはaws-‐‑‒cliのコマンド名とメソッド名が似ている •  Clientのほうが早くSDKに実装される •  Resourceのほうがリソースをオブジェクトとして綺麗麗に操作 できる 24 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 25

Slide 25 text

awspecはClientベース •  できるだけ多くのAWSリソースを実装できたほうがよい •  awspecはリソースのREADが基本なのでそこまで難しいこ とはしていないのでいける •  でも、Resourceも使いたいよね •  でも、Resourceにはリソースの操作(READ以外)もあるの で安易易に組み込めない •  「awspec使ったら書き⽅方間違えてインスタンスが削除され た」は洒落落にならない 25 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 26

Slide 26 text

26 Awspec::ResourceReader JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 27

Slide 27 text

Awspec::ResourceReader •  awspecは内部でResourceを呼び出すときは必ず Awspec::ResourceReaderを経由する •  Awspec::ResourceReaderでAWSリソースを操作しそ うなメソッドを潰している •  ブラックリスト⽅方式 •  これでほぼ安全にawspecが使える •  Resourceが使えるawspecのリソースタイプはドキュメント に”Advanced  Use”の節がある 27 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 28

Slide 28 text

vpc  describe vpc('vpc-ab123cde') do   it { should exist }   its(:resource) { should be_an_instance_of(Awspec::ResourceReader) }   its('resource.route_tables.first.route_table_id') { should eq 'rtb-a12bcd34' }   its('route_tables.first.route_table_id') { should eq 'rtb-a12bcd34' }  end 28 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 29

Slide 29 text

aws-‐‑‒cliとかのprofileの管理理 •  .aws/configと.aws/credentialsに分かれている •  なぜ?歴史的な理理由? •  環境変数も使える •  awspecもaws-‐‑‒cliと同じようにprofileやENVを利利⽤用したい •  AWSなコマンドを⾃自作する際もaws-‐‑‒cliと同じようにprofile やENVを利利⽤用したい 29 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 30

Slide 30 text

awsecrets 30 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 31

Slide 31 text

awsecrets •  Ruby製コマンドラインツール内でaws-‐‑‒cliと同じように認証 情報をAws.configに設定することを⽬目指しているgem •  awspecとkumomeで利利⽤用 •  kumome:  CloudWatchメトリクスをCLIでみれるツール •  http://k1low.hatenablog.com/entry/2016/02/01/083747 •  正直aws-‐‑‒sdk-‐‑‒rubyでやって欲しいし、Issueが上がっていたはず 31 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう  #!/usr/bin/env ruby  require 'awsecrets'  Awsecrets.load  ec2_client = Aws::EC2::Client.new  puts ec2_client   .describe_instances({ instance_ids: [ARGV.first] })   .reservations.first.instances.first

Slide 32

Slide 32 text

今後やりたいこと 32 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 33

Slide 33 text

AWSアカウント⾃自体のspec •  awspecは基本的に1つのインスタンス、1つのVPCなどAWS リソース1つ1つに対してテストが可能 •  最近はさらに上位のレベルでテストを書いておきたいことが 多発 •  「このリージョンで起動しているRDSインスタンスは5台」 •  「EC2のスケジュールドイベントは現在0件」 •  「このアカウントではIAMの数は4つ」 •  なぜ作らないのか? •  具体的な実装デザインが決まっていない •  リソースタイプ名が決まらない(aws?  account?  resources?) •  だれか決めて欲しい 33 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 34

Slide 34 text

なぜawspecなのか 34 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 35

Slide 35 text

awspecの存在意義 •  Codenize.toolsやTerraformなど、使いやすい構成管理理 ツールが出てきたため、AWSリソース⾃自体がコードで管 理理されるようになってきた •  わざわざ別にテストいらない •  「⼿手作業で構築したAWSリソースの管理理にはawspecが 良良い」 •  あれ?どこかで聞いたことが。。。 •  が、それ以外では? 35 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 36

Slide 36 text

さらに今後やりたいこと 36 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 37

Slide 37 text

 $ cat < Gemfile  source "https://rubygems.org"  gem "awspec"  EOF  $ bundle install --path=vendor/bundle --binstubs=bundle_bin  ...  Bundle complete! 1 Gemfile dependency, 25 gems now installed.  Bundled gems are installed into ./vendor/bundle.  $ du -mcs ./  22 ./  22 total 37 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 38

Slide 38 text

22MB 38 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 39

Slide 39 text

わかりますよね? 39 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 40

Slide 40 text

40 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 41

Slide 41 text

awspec  on  AWS  Lambda(未定) •  RubyがAWS  Lambdaで動けばawspecも動くはず •  CloudTrail  -‐‑‒>  S3  -‐‑‒>  AWS  Lambda  -‐‑‒>  awspec •  Rubyistにとって使いやすいAWS  Config  ConfigRule •  CIとしてのawspecがAWSの上だけで 41 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 42

Slide 42 text

まとめ •  awspecを作っています 42 JAWS-‐‑‒UG福岡:3度度⽬目の濃い⽬目にAWSの話をしてみよう

Slide 43

Slide 43 text

Thank  you!  Fusicはテクノロジーが  好きなエンジニアを募集しています  https://fusic.github.io 43