読者です 読者をやめる 読者になる 読者になる

ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

WEB+DB PRESS vol.92 に書きました

よろしくお願いします。

よろしくお願いします........!!!!!

gihyo.jp


なん年ぶりの記事かな〜と思って調べると、2014年の79号以来なので2年ちょっとぶりですね。

思えば、最初に #wdpress に書いたのも、実は新人応援号の記事だったりしたのでした。

ぼくは、冒頭の総括的な内容を書かせていただいて、あとは若手の方々に譲る気持ちでいたのですが、なんかこう、エモい感じが膨れ上がってしまい、結果的に4ページの予定が6ページになってしまっていました。まあ、ご勘弁下さいということで......。

ちなみに最初の案の原稿だと7ページ超えてました...。

内容としては、広く(アプリ、フロント、インフラ、そしてネイティブにも言及)、しかも手を動かしながらウェッブ開発者の全体像を掴めるようにできているので、楽しく学べるような教材としていい感じじゃないかな〜と思っております。 特にフロントエンドの章はぼくも勉強になりました。 @kurotaky くんお疲れ様でした。


最後に、執筆した同僚各位の記事を紹介しておきます。

tech.pepabo.com

ten-snapon.com

mapyo.hatenablog.com

ravelll.hatenadiary.jp

shiro-16.hatenablog.com

「WEB+DB PRESS Vol.92」に寄稿しました - 準二級.jp

みんな最高だったぜ!!1 担当編集の池田さんにも感謝。

第9回 コンテナ型仮想化の情報交換会@福岡 やっていきました

ct-study.connpass.com


お疲れ様でした。

同僚のものも含め、素晴らしい発表ばかりだった中、個人的には、tahira氏の発表が、いろいろな意味でよかったなあと思って感動していました。ホスティングカジュアルにも期待しています。

あと、 id:y_uuki さんの存在を確認し、老害として若手に倒される任務を果たしてきました。

続きを読む

読んだ: “Quick Desktop Application Development Using Electron”

leanpub.com

Electronの概念と、基本的な機能を一通りさらってみるという感じ。

  • 触ったのは、コンテクストメニュー、トレイ、ダイアログ、通知、電源、クリップボードなど
  • Angular.jsにも少し触っていて、Loki.jsと連携した簡単な例があった
  • Gulpとかそういうのはない...ぞ
  • コードも素のJavaScript
  • Electronのバージョンがやや古く、そのままでは動かないコードも多いので 公式 API ガイド と一緒に見ると良さそう。あれ、じゃあ公式でいいのでは...

へ〜、こんなもんか感はあったが、作る予定のアプリのキャプチャが貼られているのは便利だった。なお、PDF版しかなくコピペは困難。

miamを使ってIAMの権限をいい感じに絞って適用する

IAMというのは例のAWSのアレ。ユーザのアカウントと権限を管理するやつ。

このサービス、機能が多くてややこしいところがあり、具体的には以下のポリシーで運用するときにそのものズバリの情報がすぐに見つからなかったので、この場でまとめとこうかなって思った。

  • 原則、ユーザ管理操作は禁止
  • しかしそれぞれのユーザは自分のパスワードを更新できるようにしたい
  • さらにそれぞれのユーザは、自分だけAPI AccessKeyの発行をしたい

なお管理のために miam を使う。miamの使い方は説明しませんが、簡単なのでREADMEなど見て入れてください。

原則、ユーザ管理操作は禁止

最初に NotAction でiam系のAPI利用を前面禁止する。許可がホワイトリスト型になる。

group "PowerUser" do
  policy "PowerUser-NotAllowIam" do
    {"Version"=>"2012-10-17",
     "Statement"=>[{"Effect"=>"Allow", "NotAction"=>"iam:*", "Resource"=>"*"}]}
  end
end

しかしそれぞれのユーザは自分のパスワードを更新できるようにしたい

こんな感じの許可でOK。というか、公式にだいたい書いてある通り

iam:ListUsers も許可しないと、AWSのコンソールからユーザリストを表示できないので、操作があまりにも不便になる点に注意。

group "PowerUser" do
  policy "PowerUser-ChangePassword" do
    {"Version"=>"2012-10-17",
     "Statement"=>
      {"Effect"=>"Allow",
       "Action"=>
        ["iam:ListUsers", "iam:ChangePassword", "iam:GetAccountPasswordPolicy"],
       "Resource"=>"*"}}
  end
end

さらにそれぞれのユーザは、自分だけAPI AccessKeyの発行をしたい

「自分だけ」というのが鍵で、 "Resource"=>"*" などと指定してしまうと他人のAPI Keyも発行できて、そういう便利さは要らないので。

自分のユーザのarnだけに絞って操作可能な状態にしないといけない。

ということで、以下のようなマクロ的なメソッドを、オープンクラスで定義する。 IAMFile はただのルビーファイルなので冒頭に書いとけばいい。

追記: コメントにある通り、オープンクラスを使うよりmiamのテンプレート機能を使う方がよく、そもそも ${aws::*} といったAWS側で用意された変数を使うことも可能なようなので、この実装は「ふ〜んこんな手もあるんだ〜」といった程度のものと捉えてください。

AWS_ACCOUNT_ID = 12345678...

class Miam::DSL::Context::User
  def attach_accesskey_policy_for(username)
    policy "#{username}-accesskey-creatable" do
      {"Version"=>"2012-10-17",
       "Statement"=>
         [{"Sid"=>"Stmt#{username.gsub(/[^a-zA-Z0-9]/, '')}20160107",
           "Effect"=>"Allow",
           "Action"=>["iam:GetUser", "iam:*AccessKey*"],
           "Resource"=>["arn:aws:iam::#{AWS_ACCOUNT_ID}:user/#{username}"]}]}
    end
  end
end

気をつけることとして、 Sidアルファベットと数字 しか使えないらしい。ユーザ名にはその他の文字列も使えるのでRuby側でなんとかしておく。

その後、それぞれのユーザのカスタムポリシーとしてこんな感じにできる。

user "udzura", :path=>"/" do
  login_profile :password_reset_required=>true

  groups(
    "PowerUser"
  )

  attach_accesskey_policy_for("udzura")
end

あとは miam コマンドで確認しつつ適用。


こんな感じで、いい感じのIAMポリシーは難しいですが、やっていき方を共有するといいと思います。あととにかく miam は素晴らしいと思います。

それでは、良いお年を!

2015年にリリースしたやつらの紹介

octochan

github.com

curlで叩くとGitHubのIssueにコメントするやつ。Ikachan for GitHub

Sinatraベースで、以下のように config.ru を書くと動く。アクセス制限とかは別のRack Middlewareでやってください。

require 'octochan'

module PB
  class GitHub < Octochan::App
    set :access_token, '......'
  end

  class GHE < Octochan::App
    set :access_token, '.....'
    set :api_root,     'https://your.ghe.local/api/v3'
  end
end

map '/github' do
  run PB::GitHub
end

map '/ghe' do
  run PB::GHE
end

run lambda {|e| [404, {'Content-Type' => 'text/plain'}, ["Please Access /github or /ghe"]] }

populus

github.com

Consulの様々なeventにフックして何かするやつを作るフレームワークのはずだった。

Populus.watch :event, name: "echo" do
  cond {|data| data.any?{|d| d.has_key?('Payload')} }
  runs do |data|
    event = data.find{|d| d.has_key?('Payload')}
    Populus.logger.info Base64.decode64(event['Payload'])
  end
end

全面的に設計を見直したい感があり、いまのところ -type event しかサポートしていない。今年は何かが起こる。

soko

github.com

プラットフォームアグノースティックなサーバメタデータリポジトリみたいなのを1行で操作するやつ。

ConsulのKVSとかAWSのタグとかをストレージに指定できるようにしてある。

$ ./soko put Test Hello
OK
$ ./soko get Test
Hello

結局自分で使っていないという問題があり、仕事で構築しているやつもなんか直接 nova コマンドを叩いているまま。この知見をなんかに生かせるだろうか?

packer-provisioner-serverspec

github.com

Packerで作ったイメージについて、イメージ化の直前にServerspecを走らせ、正しくイメージになってるかどうか検査できるやつ。

いまのところOmnibusでServerspecを入れてExecモード前提で動作する。これ、たとえばSSHに必要な情報ってぶっちゃけPackerが全部持ってるよね(だからなんとかしてSSHモードでも動かせるはずだよね)とか、いろいろオプションを追加する余地がある。誰か頼む、じゃなかった今年は何かする。

{
    "builders" : [
        {
            "type": "amazon-ebs",
            "ssh_username": "centos", // should be sudoable
            "ssh_pty": true, // tty should be available after packer 0.8
            //...
        }
    ],

    "provisioners": [
        {
            "type": "shell",
            "script": "/path/to/your-provisoner.sh"
        },
        {
            "type": "serverspec",
            "source_path": "/path/to/your/serverspec-root"
        }
    ]
}

monkfish

github.com

OpenStack Compute APIから、今のテナントに所属しているサーバ一覧を引っ張って、その情報をもとに /etc/hosts を更新し、内部DNSと替えさせていただきますというやつ。DHCPなどがアレな構成でも安心。

もともとのアイディアはkurodaさんという人のPerlによるスクリプトです。

beforedo

github.com

プロジェクトセットアップのためのツールRailsとかによくある bin/bootstrap.sh みたいな環境構築スクリプトシェルスクリプトなので同じような表現がたくさん出てくるな〜と思ってそんならツールにしようと思って書いたが、使っていないのが問題。。。

以下のような Before.yaml を書いてコマンドを打つと、書いてある通りのいい感じのセットアップをしてくれる。基本的にはべき等。ポート空いてるとか、プロセスがいるとかを見てべき等っぽさを確保してくれる。

- task: mysql.server start
  port: 3306
- task: memcached -p 11211 -m 64m -d
  port: 11211
- task: bundle install --path vendor/bundle
  success: bundle check
- task: cp config/database.yml.sample config/database.yml
  file: config/database.yml
- task: bundle exec rake db:migrate
  always: true
- task: bundle exec rails s
  front: true

fluent-plugin-json_expander

github.com

matsumotolyさん? そんな感じのIDの人のために書いたやつ。タグでexpandするやつはすでにあるが、こっちはデータのボディの属性をもとに別のoutputを展開する。

やや内部実装がハッキーなので、利用する際は修正のプルリクをやっていく気持ちが必要と思う。プルリクお待ちしています。

<match access.summary>
  type json_expander
  subtype growthforecast
  delete_used_key false # or true if you want to delete the key
                        # used in template construction

  <template>
    gfapi_url http://127.0.0.1:5125/api/
    graph_path ${data[mothor_host]}/${data[vhost]}/${key_name}
    name_keys count_2xx,count_3xx,count_4xx,count_5xx
  </template>
</match>

puppet-report_slack2

github.com

Puppet masterのSlackレポーター。すでにあるやつは多分なんかgemの関係で動かなかったので、依存をギリギリまで減らして自作した。今思い出したけど Puppetアドベントカレンダー で紹介し忘れてたじゃん!

なんか海外で地味に使われているのを感じる。英語の問い合わせが僕のメアドに直接来たりした。

様子です

yao

github.com

何度か紹介してるからいいか... Yet Another Openstack client for Ruby

stackspec

github.com

awspecの...アレ。OpenStackのテナントが思った通りに構築できているか、APIを叩いて確認する。yaoのリソースのメソッドを知っていればそのまま使える感じの設計のはずが、まだ Server しか検査できないので頑張ります。。

describe server('stackspec.example.com') do

  its(:name)            { should eq 'stackspec.example.com' }
  its(:key_name)        { should eq 'sample001' }

  its(:security_groups) { should have(4).security_groups }
  it { should have_security_group(name: "https") }

  its('flavor.id')      { should eq '8' }

end
$ rspec spec/tenant_name/servers_spec.rb
OpenStack server "stackspec.example.com"
  should have security group {:name=>"https"}
  name
    should eq "stackspec.example.com"
  key_name
    should eq "sample001"
  security_groups
    should have 4 security_groups
  flavor.id
    should eq "8"

Finished in 2.36 seconds (files took 0.2018 seconds to load)
5 examples, 0 failures

今年はもっとでかいの作りたかった。あと改善するというやつもやりたいところだった。

まあ、いろいろ作ると思います。

あ、スター、プルリク、人柱等お願いします!!1