ようへいの日々精進XP

よかろうもん

curl で Basic 認証(Authorization ヘッダを利用した場合)

これは

qiita.com

初老丸 Advent Calendar 2017 3 日目になる予定の記事です.

tl;dr

  • ヘッダに付与する認証文字列を Base64エンコードする時にハマったのでメモ

curl で Basic 認証を利用する場合

これは皆さんご存知の書き方.

curl --basic -u $username:$password https://api.example.com/api/sample.json -H "accept: application/json"

Authorization ヘッダ を利用する場合

敢えて前述のオプションを使わずに, リクエストヘッダに Authorization を付与してリクエストする.

curl https://api.example.com/api/sample.json \
  -H "accept: application/json" \
  -H "Authorization:Basic $(echo -n $username:$password | openssl base64)

ユーザー名とパスワードを : でくっつけた文字列を Base64エンコードする必要がある。

echo -n $username:$password | openssl base64

echo -n しておかないと意図しない文字列が生成されるので辛かった.

$ echo "foo:bar" | openssl base64
Zm9vOmJhcgo=
$ echo -n "foo:bar" | openssl base64
Zm9vOmJhcg==

RFC で Authorization ヘッダや Basic 認証周りの情報をチェックしてみた

RFC2617 HTTP Authentication: Basic and Digest Access Authentication

Basic 認証でユーザー名とパスワードを : で繋ぐあたりのことが書かれている.

RFC7235 Hypertext Transfer Protocol (HTTP/1.1): Authentication

Authorization ヘッダの仕様が書かれている.

以上

  • メモでした
  • curl を利用する場合, Authorization ヘッダをわざわざ利用することは無いかもしれないけど
  • RFC は英語を読めなくても, ざっと斜め読みするだけでも学ぶことがあるので, これからは出来るだけ読みたいと思う

swagger-php で Basic 認証を定義する

これは

qiita.com

初老丸 Advent Calendar 2017 2 日目の記事になる予定です.

tl;dr

sample

以下のような感じで security={{"BasicAuth":{}}} と書けばイケた.

<?php
  /**
   * @SWG\Swagger(
   *     basePath="/v0.1",
   *     host="api.example.com",
   *     schemes={"https"},
   *
   *     @SWG\Info(
   *         title="example API Document",
   *         version="0.1"
   *     ),
   *
   *     @SWG\SecurityScheme(
   *         securityDefinition="BasicAuth",
   *         type="basic"
   *     ),
   * ),
   * @SWG\Get(
   *     path="/api",
   *     description="これはサンプルです.",
   *     tags={"example"},
   *     security={{"BasicAuth":{}}},
   *     @SWG\Parameter(
   *         name="foo",
   *         in="path",
   *         description="path を指定.",
   *         required=false,
   *         type="string"
   *     ),
   *     @SWG\Response(
   *         response=200,
   *         description="OK"
   *     ),
   * )
   */

  public function get_foo() {
  ...
  }

json で出力すると, 以下のような感じになる.

{
    "swagger": "2.0",
    "info": {
        "title": "example API Document",
        "version": "0.1"
    },
    "host": "api.example.com",
    "basePath": "/v0.1",
    "schemes": [
        "https"
    ],
    "paths": {
        "/api": {
            "get": {
                "tags": [
                    "example"
                ],
                "security": [
                    {
                        "basicAuth": []
                    }
                ]
... 
}

以上

メモでした.

2017 年 11 月 23 日(木)

ジョギング

日課

  • (腕立て x 30 + 腹筋 x 30) x 3
  • も少し回数を増やした方がいいのかな

奥さん

  • 鹿児島に出張
  • 城山観光ホテルに 2 泊するらしい...なんとなくだけど、羨ましい

www.shiroyama-g.co.jp

午後から

2017 年 11 月 22 日(水)

いい夫婦の日

  • 奥さんにはいつも感謝
  • 奥さんと一緒にいると楽しいし、なぜか解らないけど「生きがい」を感じる

ジョギング

  • お休み
  • 昨日、若者に煽られて頑張った名残が右足に残っていて辛い

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

今日もリビング

  • 但し、キーボードとマウスを装備した
  • 温かいと集中力もマシな感じ

夕飯

  • いつものように鍋
  • 水餃子を入れ忘れた
  • 大阪王将のモチモチ水餃子がかなりイカしている

明日は

2017 年 11 月 21 日(火)

ジョギング

  • 香椎浜 x 2 周
  • 若者に煽られてしまい、朝っぱらから 30 分台で走りきった

カラッと

  • 晴れてて気持ち良かった
  • 寒いけど

今日も

  • リビングでお仕事

夕飯

  • ベナ
  • 鍋率 90%

2017 年 11 月 20 日(月)

朝から

  • 体調激悪
  • 下痢とぼんやりとした吐き気(吐けない)が続く

寒すぎたので

  • ホットカーペットがあるリビングで仕事
  • 座椅子が欲しい

ジョギング

夕飯

  • 晩酌無し
  • 奥さんが作ってくれたのだが、とても美味しかった

2017 年 11 月 19 日(日)

帰福

  • ホテルのチェックアウトギリギリまで寝てしまい、フロントからの電話で起こされる
  • 朝食兼昼食を新橋の立ち食い寿司で
  • なんか頑固親父っぽい職人さんがちょっと怖くて、腹三分くらいでお店を出た
  • 空港に向かう京成線の中で突然腹痛に襲われて京急蒲田駅で途中下車
  • ヘロヘロだったけど、羽田空港に着く頃には復帰したのでラウンジで休憩
  • 飛行機は真ん中の席で窮屈だったけど、通路側に座っていたおっさんが通路側に倒れて寝ていたので真ん中の席の割にはリラックス出来たかも
  • 福岡に着陸間際に急に気分が悪くなって変な汗が...

ヘロヘロで

  • 家に帰り着いた
  • とりあえず風呂に入って、夕飯を食べて、陸王を流し見しつつ就寝
  • 夕飯で食べたさといもと手羽中の煮っころがしがとても美味しかった
  • やっぱり、自宅での食事が一番ホッとする

2017 年 11 月 18 日(土)

ビックカメラ有楽町店

  • 聖地
  • 一通り PC 売り場等を視察
  • MacBook Pro カッコイイなあ〜、予算上限無しで選ぶとすれば 15 インチの最高スペックが良い
  • 視察後は 7F のカフェで PHP の勉強を 3 時間程

ランチ

  • ビックカメラ有楽町店の近くの寿司屋でランチ握り 800 円(税込み)
  • シャリ小さめで〜と頼んだらホントに小さくて笑えた
  • ネタも小さいので切なくなったから、もう二度とこのお店には入らない

Boostnote

boostnote.io

のぼりーさんのクラウドインフラ Podcast で紹介されていた Boostnote を使ってみることにしたので、いくつか気付いたことを。

  • キーバインドvim 又は emacs が標準装備が嬉しい
  • Markdown がサクサクいい感じで掛けるし、プレビューもさくっと見れるのが良い
  • フォルダやタグが付けられるので Evernote っぽい使い方が出来る気がする
  • 試せていないけど、Dropbox と連携出来るらしい
  • vim モードで利用している時だけなのかもしれないけど、Edit モードと Preview モードの切り替えが動かない時がある

ちょっと気になるところは有るものの、概ね良い感じで使えているのでしばらく使ってみることにする。

金町

  • 杉原さんとよっちゃんで呑む
  • 大河原さんに久しぶりにお会いして、福岡の話とかで盛り上がった勢いで一杯ごちそうになる
  • よっちゃんの後、よし甚に
  • よし甚からのやすらぎできょうじさんと Let's try Agein をコラボ
  • 終電を逃してしまいやすらぎの片隅で一夜を過ごす(椅子を並べて横にならせてもらった)
  • よっちゃん、きょうじさん、やすらぎマスターにはいつもながら感謝、感謝、感謝!

AWS Marketplace で使用量課金しているインスタンスの使用量追跡方法についてメモ

これは

qiita.com

初老丸 Advent Calendar 2017 4 日目の記事になる予定です.

tl;dr

aws.amazon.com

この仕組みを知らなくて、適当な権限を付与してインスタンスを起動したばっかりに大泣きすることになったのでメモ.

事件は AWS Marketplace で起こった

経緯

  • AWS Marketplace で提供されている, とある製品のインスタンスを AMI から起動した
  • その製品は転送量課金となっている
  • インスタンスには EC2 ReadonlyS3 FullAccess のポリシーを付与した Instance Profile をアタッチしていた
  • インスタンス起動直後は普通に動いていたが、ある日突然、製品のログイン画面にライセンスエラーが出てしまった

初動

  • 全く原因が解らず...
  • インスタンスにログインして製品が展開されているディレクトリを彷徨っていると、以下のようなログが記録されたファイルを発見
{
  "aggregation_base": "0 B",
  "last_aggregate_usage": "0 B",
  "last_error": "com.amazonaws.AmazonServiceException: User: arn:aws:sts::123456789012:assumed-role/your-instan-profile/i-xxxxxxxxxxxxx is not authorized to perform: aws-marketplace:MeterUsage (Service: AWSMarketplaceMetering; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-)",
 
... 略
 
  "usage": {
    "pending": "0 B",
    "reported": "0 B"
  }
}

ほう。

原因

先述のログに記録されている通り, aws-marketplace:MeterUsage というポリシーが付与されていなかった為、転送量のレポートが送信出来ていなかった為にライセンスが未認証な状態になってしまった(と考えている).

対処

以下のようなポリシーを付与して, 改めてインスタンスを再作成したところ, ライセンスエラーは解消され、先述のエラーも出力されなくなった.

{
"Version": "2012-10-17",
  "Statement": [
       {
            "Action": [
                "aws-marketplace:MeterUsage"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

MeterUsage API

概要

  • http://docs.aws.amazon.com/marketplacemetering/latest/APIReference/API_MeterUsage.html
  • 使用量(転送量だったり管理ホスト数だったり)データは製品の使用の有無にかかわらず、1 時間に 1 回送信する必要がある
  • 製品が正常動作していることを確認するために, 測定レコードが 1 時間に 1 回生成されることを要求する
  • 製品からのレコード送信が停止すると, AWS では顧客に E メールを送信してネットワーク設定の調整を求める

aws-marketplace:MeterUsage アクション

  • 製品の使用量データを送信する APIMeterUsage)を呼ぶ為に必要な IAM ポリシーアクション

以下のポリシーを製品に付与する必要がある.

{
"Version": "2012-10-17",
  "Statement": [
       {
            "Action": [
                "aws-marketplace:MeterUsage"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

MeterUsage for AWS SDK for Ruby

例えば、AWS SDK for Ruby だと以下のように書くはず.

require 'aws-sdk'

client = Aws::MarketplaceMetering::Client.new()
                                             
resp = client.meter_usage({
  product_code: "ProductCode", 
  timestamp: Time.now,
  usage_dimension: "UsageDimension",
  usage_quantity: 1
  dry_run: false
})

#meter_usage メソッドの主なオプションは以下の通り.

オプション 名 用途
product_code AWS Marketplace 製品コード
timestamp ISO-8601 フォーマットのタイムスタンプ (UTC)
usage_dimension 使用量のディメンション
usage_quantity 使用量

ドキュメントを見ていたら #batch_meter_usage というメソッドも用意されていて, バッチ処理で複数の customer_identifier を送信可能なようだ.(用途不明)

ということで

AWS Marketplace の製品を利用する際はよーくドキュメントを読んで, aws-marketplace:MeterUsage アクションを許可する必要がないかを確認しましょう.

それでは、良い AWS Marketplace 生活を.

2017 年 11 月 17 日(金)

ジョギング

  • お休み
  • 右の太腿に違和感があったので良い休息になるだろう

日課

  • お休み

出張

  • 2 泊 3 日で出張
  • 当初は土曜日に会社の運動会で駅伝に出る予定だったけど、雨ということで予定がまるっと空いてしまった

鶏一代

  • 夜はチームメンバーと新橋の鶏一代というお店で呑む
  • 普段は顔を突き合わすことが無いので、呑みの場でどんな話をして良いのか戸惑ったりしたが、ま、呑めばいいかなって感じで楽しかった
  • ビールばっかりだったけど、結構呑んだ気がする
  • 焼き鳥の盛り合わせ、なかなか美味しかったけど、砂肝を頼むのを忘れていた