読書通帳⑨

読んだ本

・たのしいムーミン一家(講談社文庫)
 
https://bookclub.kodansha.co.jp/product?item=0000139838

内容と感想

以前に読んだムーミン谷の彗星の続きです。妻がだいぶ以前に購入していたものがあるというので借りて読みました。今は娘の本になっているみたいです。

ムーミン谷の彗星がどことなく暗い感じがある作品でしたが、今回は全体に明るくタイトル通りに「たのしい」ストーリーでした。

飛行おにの帽子(黒いシルクハット)を入手したことでいろんな不思議なことが起きて、ゆかいなキャラクターたちの不思議な世界観と合わさって、どんどん読み進めることができます。

最後に飛行おにがでてきて、すごい怖いキャラクタなのかと思っていたら、そんなことはなく、全体にハッピーな気分で読み終わることができました。ちなみにうちの娘は、ムーミンバレーパークの飛行おにのジップアドベンチャーが大好きです。ずっと「飛行おにってなんだろう」と思っていたので、それがわかってよかったです。
※私は高いところが苦手なので、ジップアドベンチャーはやりません。

本の中で、じゃこうねずみの入れ歯が怪物に変わってしまうシーンがあって、作者注として「なんに変わったか知りたかったら、お母さんに聞いてみて」と書いてあります。北欧にはなにかそういう言い伝えとかがあるのかな、と思って調べてみました。でも、これって家族でいろんな想像を膨らませてね、というメッセージだったみたいです。うーん、お父さんは想像力が欠けているなぁ。

まとめ

続きを読みたいので、続編を買って読もうかな。最近は電子書籍で読むことが多いです。

Amazon Connect でなんちゃって監視センター作ってみる

はじめに

システムを運用していると、どうしても夜間に電話での呼び出しが必要になる場面があります。そのためにオペレーションセンターを利用することもあると思いますが、電話かけるだけなら、なんとかできないかなと考えてみました。

まぁPagerDutyが良いと思いますが、AWS使っているんなら、Amazon Connectでも良いんじゃないかと思ってやってみた、というわけです。

処理フロー

なんらかの形でS3にファイルをアップロードする
→S3へのPUTを検知してLambdaを起動
→LambdaがAmazon Connectを呼び出して、電話をかける

S3にファイルをアップロードするスクリプト

from datetime import datetime
import boto3
AWS_S3_BUCKET_NAME = 'myalertcall'
PUT_OBJECT_KEY_NAME = datetime.now().strftime('%Y%m%d%H%M%S')

s3 = boto3.resource('s3')
bucket = s3.Bucket(AWS_S3_BUCKET_NAME)
obj = bucket.Object(PUT_OBJECT_KEY_NAME)
body = """ これはテストアラートです。
test03
"""
response = obj.put(
    Body = body.encode('utf-8'),
    ContentEncoding = 'utf-8',
    ContentType = 'text/plain'
)

Lambdaのスクリプト

from urllib.parse import unquote_plus
import boto3

def lambda_handler(event, context):
    alert_bucket_name = event['Records'][0]['s3']['bucket']['name']
    alert_object_key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    service_name = '適当なサービス'
    connect = boto3.client('connect')
    common_message = 'もうほんとやばいっち、いいよろうもん。なんとかしてっちゃ!'
    message = '{}が大変ばい。{}'.format(service_name,common_message) connect.start_outbound_voice_contact(
        DestinationPhoneNumber='+81xxxxxxxxxx',
        ContactFlowId='yyyyyyyyyyy',
        InstanceId='zzzzzzzzzzzzzz',
        SourcePhoneNumber='+81wwwwwwwwww',
        Attributes={ 'message': message }
    )

問い合わせフロー

参考にした記事と同じフローを作りました。

まとめ

Amazon Connectが何なのか全くわかっていない状態からでも、1時間もせずに電話発信ができるようになりました。Amazonすごい。

あとは、発信先が電話を取らない場合は次の発信先にかけるとかのルールを作れるようになろうと思います。もうちょっとAmazon Connectを勉強しないと。

現状のスクリプトでもS3からオブジェクト名を取れるので、それで処理を分けたり、ファイルの中身をみて処理を変えたりとかできるとより便利そうだな〜とか考えています。

参考にしたサイト

・Amazon Connectで月4ドルで電話発信する仕組みを構築する
 https://dev.classmethod.jp/articles/amazon-connect-system-alert/

2020/05/17 追記

このサイトを参考にして、電話に出ないと次の人にコールするように変えてみた。
・[Amazon Connect] 任意時間で電話の呼び出しコールを中断する方法を考えてみた
 https://dev.classmethod.jp/articles/amazon-connect-stop-calling/

本当はS3にアップしたファイルの中身とかでメッセージを変えたり、発信先を変えたりすることになるのかなと思います。

import time
from urllib.parse import unquote_plus
import boto3


def lambda_handler(event, context):
    contact_flow_id = 'hogehoge' # 自分の環境の値に変える
    instance_id = 'fugafuga'
    # alert_bucket_name = event['Records'][0]['s3']['bucket']['name']
    # alert_object_key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    connect = boto3.client('connect')
    common_message = 'とっても大変なことが起きました。もうほんとやばいです。なんとかしてください。'
    message = f'{common_message}'
    call_numbers=('phone01','phone02')  # 通知したい電話番号
    for number in call_numbers:
        res = connect.start_outbound_voice_contact(
                  DestinationPhoneNumber=number,
                  ContactFlowId=contact_flow_id,
                  InstanceId=instance_id,
                  SourcePhoneNumber='発信番号',
                  Attributes={ 
                      'message': message,
                      'is_recieved': 'calling',
                  }
        )
        contact_id = res['ContactId']
        time.sleep(10)     # 時間は適当に調整する
        attr = connect.get_contact_attributes(
                   InstanceId=instance_id,
                   InitialContactId=contact_id
                )
        if attr['Attributes']['is_recieved'] == 'recieved':
            break
        connect.stop_contact(
            InstanceId=instance_id,
            ContactId=contact_id
        )

読書通帳⑧

読んだ本

・新装版 ムーミン谷の彗星(講談社文庫)
 https://www.moomin.co.jp/books/2407

内容と感想

実は44才で初めてのムーミンです。もちろんムーミンというキャラクタは知っていましたが、ストーリーは全く知りませんでした。アニメも観たことがなかったのです。で、なんで急にどうしたの?と思うわけですよね。

今、小5になる娘がいまして、その子がムーミンを読んでハマっておりまして、話題についていけるようにと読みました。

ムーミン谷の彗星は、童話チックな内容を想像していたらちょっと違っていて、少し怖い感じもあるストーリーでした。ムーミン谷に彗星が迫ってきて、それを調べるために天文台に向かって…

スニフやスナフキンもすべてが初登場ということで、とても新鮮な感じです。スノークのおじょうさんとムーミンの出会いも素敵でした。

年甲斐もなくムーミン谷は最後、どうなってしまうのだろうとハラハラしました。とはいえ、決してハラハラドキドキの連続で手に汗を握る、というものではなく、ムーミンの不思議な世界と愉快なキャラクタが、なんだかふんわりした気持ちにさせてくれる本です。

1日半くらいで読み終わったら、娘が「楽しいムーミン一家」を貸してくれたので、今読んでいます。

ちなみに

少し前に飯能のムーミンバレーパークにも行ったのですが、今行ったらもっと楽しいかもという気になっています。残念ながら休園していますが…

・ムーミンバレーパーク・メッツァビレッジ
 https://metsa-hanno.com/

読書通帳⑦

読んだ本

・[試して理解] Linuxのしくみ
 https://gihyo.jp/book/2018/978-4-7741-9607-7

内容と感想

Software Designで連載されている記事をまとめたものなのかな、と思って買いました。ボリューム的に雑誌連載をまとめたものよりも多い気がするので、お得な気分です。

プロセススケジューリング、メモリ管理、仮想記憶、ファイルシステム、ストレージデバイスの順で書かれていて、それぞれでLinuxがどのように振る舞うのかを、実験してみせてくれているのがとてもうれしいです。

いったん、全部に目を通した後、実験プログラムを追試験?してみています。ちゃんと理解しながらやろうと思っているので、それなりに時間がかかっていますが、その価値はあると感じています。

Linuxのより詳細については、Linuxカーネル2.6解読室やLinuxシステムプログラミングなどの方が詳しい印象ですが、Linuxマシンの運用が主体の私にとっては、この本の方が良かったです。

Software Designの連載は続いているので、この本も続編が出るのかな〜と期待しています。楽しみです。

ちなみに

実験プログラムの中身で、なんでこうしているのだろうとわからないところがあったので、Twitterで著者に質問したら、とてもフランクに回答してくださいました。

お尋ねしてすぐに回答をいただけるのはとてもうれしかったです。