<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Diary on mfjt.jp</title>
    <link>https://mfjt.jp/diary/</link>
    <description>Recent content in Diary on mfjt.jp</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>ja-jp</language>
    <lastBuildDate>Wed, 03 Jan 2024 17:32:00 +0900</lastBuildDate>
    <atom:link href="https://mfjt.jp/diary/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>tDiary から Hugo へ移行した</title>
      <link>https://mfjt.jp/diary/2024/01/03/173200/</link>
      <pubDate>Wed, 03 Jan 2024 17:32:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2024/01/03/173200/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mfjt.jp/diary/2022/12/04/000000/&#34;&gt;1 年ほど前から GCP 上で tDiary を Docker 運用&lt;/a&gt;していたが、それもやめて Cloudflare Pages で Hugo をビルドする形にした。&lt;/p&gt;
&lt;p&gt;数が少なかったのでデータの移行は完全手動で行ったが、それでも面倒は面倒だった。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/diary/2022/12/04/000000/">1 年ほど前から GCP 上で tDiary を Docker 運用</a>していたが、それもやめて Cloudflare Pages で Hugo をビルドする形にした。</p>
<p>数が少なかったのでデータの移行は完全手動で行ったが、それでも面倒は面倒だった。</p>
<p>新日記へのリダイレクトは、旧日記用サブドメインに Cloudflare Workers でテキトーに作ったものを仕掛けた。移行のタイミングで URI 構成を変えてしまったのでそのままでは上手く飛ばせないが、以下のように Hugo 側でエイリアスを設定してやることで解決できた。</p>
<pre tabindex="0"><code>aliases:
  - /diary/20230102.html
</code></pre><p>1 日に複数のエントリを書いていなかったから単純なやり方で済んだが、そうでなかった場合は考慮が必要そう。</p>
<ul>
<li>cf. <a href="https://www.machu.jp/posts/20220409/p01/">tDiaryの日記を静的サイトジェネレータで表示したい (2)</a></li>
</ul>
<ins datetime="2024-01-07T18:30:00+09:00">
<p>リダイレクトだけならわざわざ Cloudflare Workers を使うまでもなかった。</p>
<ul>
<li>cf. <a href="https://community.cloudflare.com/t/topic/306137">あるドメインを別のドメインにリダイレクトする - 日本語 - Cloudflare Community</a></li>
</ul>
<p>192.0.2.1 に向けるというのが「なるほどな」という感じ。</p>
</ins>
]]></content:encoded>
    </item>
    <item>
      <title>Fly.io に GoToSocial のおひとりさまインスタンスを立てた</title>
      <link>https://mfjt.jp/diary/2023/01/02/000000/</link>
      <pubDate>Mon, 02 Jan 2023 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2023/01/02/000000/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;2017 年の第一次 Mastodon ブームの折にも自前でインスタンスを立ててみたものの、当時使っていたさくらの VPS ではあまりにも重すぎたのと、Mastodon を積極的に使う理由も無く「結局 Twitter でええやん」となり、すぐに使わなくなった
&lt;ul&gt;
&lt;li&gt;余談だが、行儀の悪い方法でインスタンスを潰したせいか、当時の URI に対して未だにリクエストが来ているのが分かったので、Cloudflare Workers で &lt;code&gt;410 Gone&lt;/code&gt; を返すようにした&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最近の Twitter のゴタゴタを受けても、個人的には思想的にどうのこうのという理由で積極的に脱 Twitter しようという感じではないものの、万が一・億が一レベルで物理的に Twitter が残るか怪しい雰囲気も出てきたことや、世間的に脱 Twitter が加速したときの準備をしようと思い、年末くらいから動き始めた&lt;/li&gt;
&lt;li&gt;Mastodon はおひとりさまインスタンスにはヘビーすぎるので Misskey を試したけど、なぜかリモートフォローができず詰まっていた
&lt;ul&gt;
&lt;li&gt;Cloudflare が悪さして Misskey までリクエストが届いていなかったりしたということはあったものの、その辺りを潰してもなお解消せずお手上げだった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;そうこうしているうちに&lt;a href=&#34;https://www.zukeran.org/shin/d/2022/12/22/my-own-gotosocial-server/&#34;&gt;脱TwitterしたいのでMastodonに移行しつつ、gotosocialでオレオレサーバーを立ててみた&lt;/a&gt;というエントリをはてブ経由か何かで見つけて、これ良さそうだなと思って試し始めた&lt;/li&gt;
&lt;li&gt;Misskey と同様、Docker で自前で動かしているとなぜかうまくいかなかったが、&lt;a href=&#34;https://the.kalaclista.com/echos/2022/11/26/133159/&#34;&gt;Fly.io で動かす&lt;/a&gt;という方法があることを知り Fly.io で試したら何となく上手く動き始めたっぽい
&lt;ul&gt;
&lt;li&gt;Fly.io、&lt;a href=&#34;https://mfjt.jp/diary/2022/12/04/000000/&#34;&gt;この日記の引っ越しを検討したとき&lt;/a&gt;にも存在は認知はしていたが禄に調べてなかったけど、Dockerfile や Docker イメージを食わせれば何でも動くっぽいので、そのうちこの日記も移してしまいたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった経緯で &lt;a href=&#34;https://gts.mfjt.jp/@mfjt&#34;&gt;@mfjt@mfjt.jp&lt;/a&gt; でおひとりさまインスタンスを始めた。Twitter 自体、自ら発信するというよりは情報を拾うために使う傾向が強く、「今後は GoToSocial の方でばりばりやっていく」という気概も一切ないので、こっちはこっちでテキトーに使っていく。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<ul>
<li>2017 年の第一次 Mastodon ブームの折にも自前でインスタンスを立ててみたものの、当時使っていたさくらの VPS ではあまりにも重すぎたのと、Mastodon を積極的に使う理由も無く「結局 Twitter でええやん」となり、すぐに使わなくなった
<ul>
<li>余談だが、行儀の悪い方法でインスタンスを潰したせいか、当時の URI に対して未だにリクエストが来ているのが分かったので、Cloudflare Workers で <code>410 Gone</code> を返すようにした</li>
</ul>
</li>
<li>最近の Twitter のゴタゴタを受けても、個人的には思想的にどうのこうのという理由で積極的に脱 Twitter しようという感じではないものの、万が一・億が一レベルで物理的に Twitter が残るか怪しい雰囲気も出てきたことや、世間的に脱 Twitter が加速したときの準備をしようと思い、年末くらいから動き始めた</li>
<li>Mastodon はおひとりさまインスタンスにはヘビーすぎるので Misskey を試したけど、なぜかリモートフォローができず詰まっていた
<ul>
<li>Cloudflare が悪さして Misskey までリクエストが届いていなかったりしたということはあったものの、その辺りを潰してもなお解消せずお手上げだった</li>
</ul>
</li>
<li>そうこうしているうちに<a href="https://www.zukeran.org/shin/d/2022/12/22/my-own-gotosocial-server/">脱TwitterしたいのでMastodonに移行しつつ、gotosocialでオレオレサーバーを立ててみた</a>というエントリをはてブ経由か何かで見つけて、これ良さそうだなと思って試し始めた</li>
<li>Misskey と同様、Docker で自前で動かしているとなぜかうまくいかなかったが、<a href="https://the.kalaclista.com/echos/2022/11/26/133159/">Fly.io で動かす</a>という方法があることを知り Fly.io で試したら何となく上手く動き始めたっぽい
<ul>
<li>Fly.io、<a href="/diary/2022/12/04/000000/">この日記の引っ越しを検討したとき</a>にも存在は認知はしていたが禄に調べてなかったけど、Dockerfile や Docker イメージを食わせれば何でも動くっぽいので、そのうちこの日記も移してしまいたい</li>
</ul>
</li>
</ul>
<p>といった経緯で <a href="https://gts.mfjt.jp/@mfjt">@mfjt@mfjt.jp</a> でおひとりさまインスタンスを始めた。Twitter 自体、自ら発信するというよりは情報を拾うために使う傾向が強く、「今後は GoToSocial の方でばりばりやっていく」という気概も一切ないので、こっちはこっちでテキトーに使っていく。</p>
<p>「おま環」の可能性は否めないけど、Fly.io で詰まった点がいくつかあるのでメモ。</p>
<ul>
<li><code>flyctl</code> を打っても反応が無かったり、著しく反応が遅いことがある
<ul>
<li>特定のコマンドに限らず発生する</li>
<li>未だに解消はしておらず、再実行を繰り返すしか対処しようがないが、今後は GoToSocial のバージョンアップ時の再デプロイくらいでしか使わないだろうから目をつぶることにする</li>
</ul>
</li>
<li>CNAME レコードで独自ドメインを設定すると、Cloudflare でプロキシできなかったり、なぜか繋がらない・通信が詰まる感じになることがある
<ul>
<li>Cloudflare でプロキシできない件については、ググって出てきた Fly.io のフォーラムの情報などを見る限りでは「プロキシさせるな」が答えのように見受けられたので大人しくそうした</li>
<li>プロキシさせないことで「なぜか全く繋がらない」という事象が一旦は解消できたと思われたが、それでもタイミングによっては繋がらなかったり、フン詰まるということが発生していた。これについては、当てずっぽうで A レコード (と AAAA レコード) に変えてみたら綺麗に解消した</li>
<li>また (これも理由はよく分からないけど)、副次的に Cloudflare でプロキシさせても問題なくなったので、画像ファイル等のストレージである S3 に対するリクエストを減らすことができた (はず)</li>
</ul>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>2022 年買ってよかったもの</title>
      <link>https://mfjt.jp/diary/2022/12/31/000000/</link>
      <pubDate>Sat, 31 Dec 2022 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2022/12/31/000000/</guid>
      <description>&lt;h2 id=&#34;hahahugoshortcode21s0hbhb&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09GRVJKBP?tag=mfjt-22&#34;&gt;Panasonic MC-NS10K&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ダイソンのスティック型が壊れたので買い換え。&lt;/p&gt;
&lt;p&gt;わしに必要だったのは、吸引力じゃなくてゴミ捨て時に「掃除機の掃除機」が要らない掃除機だった&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。どうせ犬小屋住まいだしバッテリー保ちなんかも問題なし。&lt;/p&gt;
&lt;h2 id=&#34;hahahugoshortcode21s1hbhb&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Y1R9VG4?tag=mfjt-22&#34;&gt;スプラトゥーン 3&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;久しぶりにゲームに大ハマりして、現在進行形で大分時間を溶かされている。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="hahahugoshortcode21s0hbhb"><a href="https://www.amazon.co.jp/dp/B09GRVJKBP?tag=mfjt-22">Panasonic MC-NS10K</a></h2>
<p>ダイソンのスティック型が壊れたので買い換え。</p>
<p>わしに必要だったのは、吸引力じゃなくてゴミ捨て時に「掃除機の掃除機」が要らない掃除機だった<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。どうせ犬小屋住まいだしバッテリー保ちなんかも問題なし。</p>
<h2 id="hahahugoshortcode21s1hbhb"><a href="https://www.amazon.co.jp/dp/B09Y1R9VG4?tag=mfjt-22">スプラトゥーン 3</a></h2>
<p>久しぶりにゲームに大ハマりして、現在進行形で大分時間を溶かされている。</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">『スプラトゥーン3』は、もっともあそんだソフトでした。<a href="https://t.co/wdqvMj62Xj">https://t.co/wdqvMj62Xj</a><a href="https://twitter.com/hashtag/NintendoSwitch2022?src=hash&amp;ref_src=twsrc%5Etfw">#NintendoSwitch2022</a> <a href="https://t.co/7cMbzBPYN2">pic.twitter.com/7cMbzBPYN2</a></p>&mdash; oɹıɥɐsɐɯ ɐʇıɾnɟ (@mfjt) <a href="https://twitter.com/mfjt/status/1603067185618124800?ref_src=twsrc%5Etfw">December 14, 2022</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<p>ナワバリバトルばっかりやってるせいもあってウデマエは A にタッチしたことがあるくらいだし、サーモンランも「たつじん」をうろうろしてるくらいの下手くそだけど、飽きずにプレイし続けている。昨日からヨビ祭が始まったので正月休みもこれで大体潰れてしまいそう。</p>
<h2 id="hahahugoshortcode21s3hbhb"><a href="https://www.amazon.co.jp/dp/B00DTLHXFW?tag=mfjt-22">エアウィーヴ ピロー S-LINE</a></h2>
<p>買ったというか<a href="https://hb.afl.rakuten.co.jp/ichiba/2e77af60.a47c06bd.2e77af61.b2cd2e11/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Ff235016-kota%2F6506-30000753%2F&amp;link_type=text&amp;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjAsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9">ふるさと納税の返礼品</a>として。控除上限的にもちょうど良さげだったので QOL 向上を目論んでこれにした。</p>
<p>届いてから初見の感想は「ただのでかい枕」、「値段を考えると失敗したかも」というものだったが、使ってみると感想がガラッと変わった。何が良いのか言語化できないもどかしさがあるし、人によって向き不向きがあるものだろうけど、わしには合っていたので満足している。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>実際に掃除機の掃除機を使っていたわけではないが&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>tDiary を GCP に移した</title>
      <link>https://mfjt.jp/diary/2022/12/04/000000/</link>
      <pubDate>Sun, 04 Dec 2022 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2022/12/04/000000/</guid>
      <description>&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;脱 Heroku 一応終わった。Docker にしてしまったあたり、微妙に退化してしまった感があるが、Container Optimized OS にしたのはせめてもの抵抗ということで&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">脱 Heroku 一応終わった。Docker にしてしまったあたり、微妙に退化してしまった感があるが、Container Optimized OS にしたのはせめてもの抵抗ということで</p>&mdash; oɹıɥɐsɐɯ ɐʇıɾnɟ (@mfjt) <a href="https://twitter.com/mfjt/status/1588876266446684160?ref_src=twsrc%5Etfw">November 5, 2022</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<p><a href="/diary/2018/12/30/000000/">2018 年 12 月から Heroku で動かしていた</a>この日記も Heroku の Free Dyno 廃止にともなって引っ越した。乞食運用を続けるとなると知ってる限りでは GCP (GCE) くらいしか選択肢が無いから移行先はすぐに決まった。PaaS から IaaS へ逆戻りは致し方ないとして、どうせコンテナを動かすだけだし今更「フツー」の Linux ディストリビューションを使うのも色々面倒なので Container-Optimized OS にしたみた。</p>
<p>Container-Optimized OS の存在は昔から知っていて、できることの制限が厳しいのかと勝手に思っていたけど、Docker を動かすことに限れば「フツー」の Linux ディストリビューションとほとんど遜色ない感じではある。ただそうは言っても完全に同じように使えるというわけではないが、<a href="https://gotohayato.com/content/525/">GCP の Container-Optimized OS でサイトを運用するときの tips</a> というページが非常に役立った。</p>
<p>試行錯誤の末に以下のような感じになった。</p>
<h2 id="cloud-init">cloud-init</h2>
<ul>
<li>最初はタダで済む「標準永続ディスク」1 本でインスタンスを立てたけど、あんまりにも遅すぎるので、システム領域およびスワップ用として「バランス永続ディスク」を追加して、「標準永続ディスク」はデータ領域に変更した。これのせいで完全無料ではなくなったけど、多分 ¥ 100 もしないくらいだろうし十分安い</li>
<li>Docker のもろもろのファイルの置き場所は「標準永続ディスク」にしたので相変わらず遅いっちゃ遅いけど、ここは我慢することにした</li>
</ul>
<pre tabindex="0"><code>#cloud-config
timezone: Asia/Tokyo

write_files:
- path: /etc/docker/daemon.json
  content: |
    {
            &#34;data-root&#34;: &#34;/mnt/disks/docker&#34;,
            &#34;live-restore&#34;: true,
            &#34;log-driver&#34;: &#34;gcplogs&#34;,
            &#34;storage-driver&#34;: &#34;overlay2&#34;,
            &#34;mtu&#34;: 1460
    }
- path: /etc/systemd/system/nginx.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=nginx
    Requires=docker.service

    [Service]
    ExecStart=/usr/bin/docker run -e TZ=Asia/Tokyo --name nginx --network nginx-proxy -p 443:443 --pull always --rm -v /var/docker/nginx/conf.d:/etc/nginx/conf.d -v /var/cache/nginx:/var/cache/nginx -v /var/run:/var/run nginx:stable-alpine
    ExecStop=/usr/bin/docker stop nginx
    ExecStopPost=/usr/bin/docker rm nginx
- path: /etc/systemd/system/tdiary.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=tDiary
    Requires=docker.service

    [Service]
    ExecStart=/usr/bin/docker run --rm -v /var/docker/tdiary:/var/docker/tdiary -v /var/run/docker.sock:/var/run/docker.sock -w=/var/docker/tdiary docker/compose:1.29.2 up
    ExecStop=/usr/bin/docker run --rm -v /var/docker/tdiary:/var/docker/tdiary -v /var/run/docker.sock:/var/run/docker.sock -w=/var/docker/tdiary docker/compose:1.29.2 down

runcmd:
- systemctl daemon-reload
- systemctl restart docker
- systemctl start tdiary.service
- systemctl start nginx.service

bootcmd:
- swapon /var/swapfile
- fsck.ext4 -tvy /dev/sdb1
- mkdir -p /mnt/disks/docker
- mount -o nosuid,nodev,commit=30,defaults -t ext4 /dev/sdb1 /mnt/disks/docker
</code></pre><h2 id="tdiary-の-docker-composeyml">tDiary の docker-compose.yml</h2>
<ul>
<li>公式の Docker イメージだと MongoDB が使えない、けど自分でイメージをビルドするのも面倒、ということで <code>command</code> に小細工を仕込んでお茶を濁している</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yml:docker-compose.yml" data-lang="yml:docker-compose.yml"><span style="display:flex;"><span><span style="color:#f92672">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">tdiary</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">tdiary/tdiary:${TDIARY_VERSION}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">env_file</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./.env</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">command</span>: &gt;<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">      sh -c &#39;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        echo &#34;gem \&#34;tdiary-io-mongodb\&#34;&#34; &gt;&gt; /usr/src/app/Gemfile.local &amp;&amp;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        echo &#34;gem \&#34;tdiary-cache-memcached\&#34;&#34; &gt;&gt; /usr/src/app/Gemfile.local &amp;&amp;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        curl -o /usr/src/app/tdiary.conf https://raw.githubusercontent.com/tdiary/tdiary-core/v${TDIARY_VERSION}/misc/paas/heroku/tdiary.conf &amp;&amp;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        bundle --path=vendor/bundle --without=development:test --retry=3 &amp;&amp;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        bundle exec rackup&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">expose</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">9292</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">default</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">nginx-proxy</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">memcached</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./.htpasswd:/usr/src/app/data/.htpasswd</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">memcached</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">memcached:1.6.17-alpine</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">default</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">default</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">internal</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">nginx-proxy</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">external</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>.env はこんな感じ。</p>
<pre tabindex="0"><code>TDIARY_VERSION=5.2.4
AMAZON_ACCESS_KEY=********
AMAZON_SECRET_KEY=********
MEMCACHE_SERVERS=memcached:11211
MONGODB_URI=mongodb+srv://********
RACK_ENV=production
TZ=Asia/Tokyo
</code></pre><h2 id="big-thanks-to-heroku">Big thanks to Heroku</h2>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Heroku のアカウント消した</p>&mdash; oɹıɥɐsɐɯ ɐʇıɾnɟ (@mfjt) <a href="https://twitter.com/mfjt/status/1599086226552029184?ref_src=twsrc%5Etfw">December 3, 2022</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


]]></content:encoded>
    </item>
    <item>
      <title>2020 年買ってよかったもの</title>
      <link>https://mfjt.jp/diary/2020/12/31/000000/</link>
      <pubDate>Thu, 31 Dec 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/12/31/000000/</guid>
      <description>&lt;p&gt;目新しいものは特にない。&lt;/p&gt;
&lt;h2 id=&#34;hahahugoshortcode18s0hbhb&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B003LKJST0?tag=mfjt-22&#34;&gt;サンコー 3 軸式くねくねモニターアーム&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在宅勤務関連アイテムその 1。&lt;/p&gt;
&lt;p&gt;ディスプレイのスタンドがデカくて、デスクの手前のスペースが狭くなってしまうのが嫌だったので導入。ぐりぐり動かせる必要はなかったので安価なこれにした。ディスプレイが 9 kg 近くあって設置・調整には苦労したけど、1 回固定してからは今のところお辞儀することもなく安定しているので良い感じ。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>目新しいものは特にない。</p>
<h2 id="hahahugoshortcode18s0hbhb"><a href="https://www.amazon.co.jp/dp/B003LKJST0?tag=mfjt-22">サンコー 3 軸式くねくねモニターアーム</a></h2>
<p>在宅勤務関連アイテムその 1。</p>
<p>ディスプレイのスタンドがデカくて、デスクの手前のスペースが狭くなってしまうのが嫌だったので導入。ぐりぐり動かせる必要はなかったので安価なこれにした。ディスプレイが 9 kg 近くあって設置・調整には苦労したけど、1 回固定してからは今のところお辞儀することもなく安定しているので良い感じ。</p>
<h2 id="ニトリ-ワークチェア-クエト"><a href="https://hb.afl.rakuten.co.jp/ichiba/1e40bcf0.47cf9e70.1e40bcf1.9279b86c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fnitori%2F6620524%2F&amp;link_type=hybrid_url&amp;ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJoeWJyaWRfdXJsIiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9">ニトリ ワークチェア クエト</a></h2>
<p>在宅勤務関連アイテムその 2。</p>
<p>今の住み処に引っ越すタイミングでデスクは買うてたのに、なぜか椅子がない生活を過ごすこと早数年。このまま在宅勤務に突入するのはさすがにヤバいと思い購入。ガシガシ使うのであれば 10 万近い投資もアリだけど、この先どうなるか分からない中でその気にはなれなかったのでこのクラスで妥協{{fn &lsquo;現に 12 月末時点でほぼ出社に戻ってしまっている&rsquo;}}。上には上があるだろうが、知らない方がいい世界もあるということで。</p>
<h2 id="hahahugoshortcode18s1hbhb"><a href="https://www.amazon.co.jp/dp/B0786WWQR3?tag=mfjt-22">Apple EarPods</a></h2>
<p>在宅勤務関連アイテムその 3。</p>
<p>元々使っていた <a href="https://www.amazon.co.jp/dp/B07BXMBYYQ?tag=mfjt-22">WI-SP600N</a> で Web 会議をやってたが、自分の周りの音を必要以上に拾いすぎるのと、カナル型で遮音性が高いことと、ヘッドセットとして使うと外音取り込みが使えない仕様 (?) が相まって自分が喋るときの違和感が半端なかったのが不満だった。これも上を見出すとキリがないし、ほぼほぼ出社している現状、持ち運ぶことも考慮するとこのあたりに落ち着いた。</p>
<h2 id="hahahugoshortcode18s3hbhb"><a href="https://www.amazon.co.jp/dp/B0062EZYJA?tag=mfjt-22">abrAsus 薄い財布</a></h2>
<p>本当は冠婚葬祭用で数年前に買ってたけど、メイン財布を置き換えたので今年にカウント。</p>
<p>薄い財布は小銭入れ部分が使いにくいと思っていてメイン財布の置き換えには至っていなかったが、クラウドファンディングで小銭入れ部分の構造が違うパクりっぽい財布が出てきたので、その財布を買って届くまでの繋ぎのつもりで使い始めたら、なんだ目茶苦茶便利やんということに気付いてそのまま使い続けている。小銭をしまうときにあたふたするけど、見通しの良さには変えられない。</p>
<h2 id="hahahugoshortcode18s4hbhb"><a href="https://www.amazon.co.jp/dp/B01CS26JCK?tag=mfjt-22">クリニカアドバンテージ デンタルフロス Y 字タイプ</a></h2>
<p>別に新製品でもなんでもないみたいだが、なぜかここまで視界に入っていなかった。奥歯周りが劇的にやりやすくなって感動モノ。{{kw &lsquo;Floss or Die&rsquo;}}.</p>
]]></content:encoded>
    </item>
    <item>
      <title>tDiary で使っている Heroku の mLab MongoDB add-on を MongoDB Atlas へ移行した</title>
      <link>https://mfjt.jp/diary/2020/10/18/000000/</link>
      <pubDate>Sun, 18 Oct 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/10/18/000000/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mikan.github.io/2020/07/11/migrate-heroku-mlab-to-mongodb-atlas/&#34;&gt;Heroku の mLab Add-on を MongoDB Atlas に移行する&lt;/a&gt;というエントリを見ながらやってみたらさくっと終わった。&lt;/p&gt;
&lt;p&gt;良い感じの移行先がないようであれば、PaaS はやめて自前 Docker にでもするしかないかなと考えていたが、ひとまずはこれで継続する。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://mikan.github.io/2020/07/11/migrate-heroku-mlab-to-mongodb-atlas/">Heroku の mLab Add-on を MongoDB Atlas に移行する</a>というエントリを見ながらやってみたらさくっと終わった。</p>
<p>良い感じの移行先がないようであれば、PaaS はやめて自前 Docker にでもするしかないかなと考えていたが、ひとまずはこれで継続する。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cubase LE 5 の再アクティベーション方法メモ</title>
      <link>https://mfjt.jp/diary/2020/06/03/000000/</link>
      <pubDate>Wed, 03 Jun 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/06/03/000000/</guid>
      <description>&lt;p&gt;未だに &lt;a href=&#34;https://www.amazon.co.jp/dp/B0034XUXCK?tag=mfjt-22&#34;&gt;G2.1Nu&lt;/a&gt; にバンドルされていた Cubase LE 5 を使っているが、Windows 再インストールのたびにアクティベーションの方法が分からなくなってしまうのでメモ。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>未だに <a href="https://www.amazon.co.jp/dp/B0034XUXCK?tag=mfjt-22">G2.1Nu</a> にバンドルされていた Cubase LE 5 を使っているが、Windows 再インストールのたびにアクティベーションの方法が分からなくなってしまうのでメモ。</p>
<p>順当にいけば、</p>
<ol>
<li><a href="https://japan.steinberg.net/jp/support/downloads/elcc.html">最新版の eLicenser</a> をインストールする</li>
<li>eLicenser を起動して、Soft-eLicenser 番号を確認する</li>
<li><a href="https://japan.steinberg.net/jp/mysteinberg.html">My Steinberg</a> にログインし、新しい Soft-eLicenser 番号でアクティベーションコードを再発行する</li>
<li>再発行されたアクティベーションコードを eLicenser に登録する</li>
</ol>
<p>という手順で問題ないんだろうけど、Soft-eLicenser 番号が表示されずに手詰まりになる。</p>
<p>ということで、<a href="https://helpcenter.steinberg.de/hc/en-us/articles/206632670-Soft-eLicenser-virtual-license-container-is-missing">eLC Installation Helper</a> というやつの出番になる。普通の eLicenser に上書きでインストールする必要があるのか否かいまいち分からんが多分どっちでも良いと思う。これで Soft-eLicenser 番号が表示されるようになるので、新しいアクティベーションコードを発行できる。eLicenser を管理者権限で起動する必要もなかった。</p>
]]></content:encoded>
    </item>
    <item>
      <title>JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;LT(オンライン) を CLI でやってみる (ハンズオン 3&#39; 編) #jawsug_bgnr</title>
      <link>https://mfjt.jp/diary/2020/05/10/000000/</link>
      <pubDate>Sun, 10 May 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/05/10/000000/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mfjt.jp/diary/2020/05/03/000000/&#34;&gt;ハンズオン 1 編&lt;/a&gt;、&lt;a href=&#34;https://mfjt.jp/diary/2020/05/04/000000/&#34;&gt;ハンズオン 2 編&lt;/a&gt;、&lt;a href=&#34;https://mfjt.jp/diary/2020/05/05/000000/&#34;&gt;ハンズオン 3 編&lt;/a&gt;の続き。&lt;/p&gt;
&lt;p&gt;2 つめの S3 バケットまではハンズオン 3 編を使い回しで。ただし、前回の分は削除してしまったので、改めて作成。&lt;/p&gt;
&lt;script async class=&#34;speakerdeck-embed&#34; data-slide=&#34;81&#34; data-id=&#34;24f614255d9045bb8af29b9d62f65c62&#34; data-ratio=&#34;1.77777777777778&#34; src=&#34;//speakerdeck.com/assets/embed.js&#34;&gt;&lt;/script&gt;
&lt;h2 id=&#34;lambda-function-作成&#34;&gt;Lambda Function 作成&lt;/h2&gt;
&lt;p&gt;2 つめのバケットに PUT されたことをきっかけに動く Lambda Function を作成 (後述するけど、これでは動かなかった)。Python で書いたことがないので気持ち悪いところとかあるのかもしれないけれど、とりあえずは動けばいいや的な。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/diary/2020/05/03/000000/">ハンズオン 1 編</a>、<a href="/diary/2020/05/04/000000/">ハンズオン 2 編</a>、<a href="/diary/2020/05/05/000000/">ハンズオン 3 編</a>の続き。</p>
<p>2 つめの S3 バケットまではハンズオン 3 編を使い回しで。ただし、前回の分は削除してしまったので、改めて作成。</p>
<script async class="speakerdeck-embed" data-slide="81" data-id="24f614255d9045bb8af29b9d62f65c62" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>
<h2 id="lambda-function-作成">Lambda Function 作成</h2>
<p>2 つめのバケットに PUT されたことをきっかけに動く Lambda Function を作成 (後述するけど、これでは動かなかった)。Python で書いたことがないので気持ち悪いところとかあるのかもしれないけれど、とりあえずは動けばいいや的な。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python:translate-function.py" data-lang="python:translate-function.py"><span style="display:flex;"><span><span style="color:#f92672">import</span> json
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> urllib.parse
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> boto3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>s3 <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(<span style="color:#e6db74">&#39;s3&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">lambda_handler</span>(event, context):
</span></span><span style="display:flex;"><span>    bucket <span style="color:#f92672">=</span> event[<span style="color:#e6db74">&#39;Records&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;s3&#39;</span>][<span style="color:#e6db74">&#39;bucket&#39;</span>][<span style="color:#e6db74">&#39;name&#39;</span>]
</span></span><span style="display:flex;"><span>    key <span style="color:#f92672">=</span> urllib<span style="color:#f92672">.</span>parse<span style="color:#f92672">.</span>unquote_plus(event[<span style="color:#e6db74">&#39;Records&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;s3&#39;</span>][<span style="color:#e6db74">&#39;object&#39;</span>][<span style="color:#e6db74">&#39;key&#39;</span>], encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;utf-8&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    s3_obj <span style="color:#f92672">=</span> s3<span style="color:#f92672">.</span>get_object(Bucket<span style="color:#f92672">=</span>bucket, Key<span style="color:#f92672">=</span>key)
</span></span><span style="display:flex;"><span>    s3_json <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>loads(s3_obj[<span style="color:#e6db74">&#39;Body&#39;</span>]<span style="color:#f92672">.</span>read())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    translate <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(<span style="color:#e6db74">&#39;translate&#39;</span>)
</span></span><span style="display:flex;"><span>    input_text <span style="color:#f92672">=</span> s3_json[<span style="color:#e6db74">&#39;results&#39;</span>][<span style="color:#e6db74">&#39;transcripts&#39;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    response <span style="color:#f92672">=</span> translate<span style="color:#f92672">.</span>translate_text(
</span></span><span style="display:flex;"><span>        Text <span style="color:#f92672">=</span> input_text,
</span></span><span style="display:flex;"><span>        SourceLanguageCode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;en&#39;</span>,
</span></span><span style="display:flex;"><span>        TargetLanguageCode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;ja&#39;</span>
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    output_text <span style="color:#f92672">=</span> response[<span style="color:#e6db74">&#39;TranslatedText&#39;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;statusCode&#39;</span>: <span style="color:#ae81ff">200</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;body&#39;</span>: json<span style="color:#f92672">.</span>dumps({
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#39;output_text&#39;</span>: output_text
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ zip translate-function.zip translate-function.py
</span></span><span style="display:flex;"><span>  adding: translate-function.py <span style="color:#f92672">(</span>deflated 51%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws lambda create-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name translate-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --runtime python3.8 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --handler translate-function.lambda_handler <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --zip-file fileb://translate-function.zip
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionName&#34;</span>: <span style="color:#e6db74">&#34;translate-function&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionArn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Runtime&#34;</span>: <span style="color:#e6db74">&#34;python3.8&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Role&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Handler&#34;</span>: <span style="color:#e6db74">&#34;translate-function.lambda_handler&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSize&#34;</span>: 573,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Description&#34;</span>: <span style="color:#e6db74">&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Timeout&#34;</span>: 3,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;MemorySize&#34;</span>: 128,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastModified&#34;</span>: <span style="color:#e6db74">&#34;2020-05-10T10:06:48.639+0000&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSha256&#34;</span>: <span style="color:#e6db74">&#34;cMOe2mMvBRbkGApMIgK/7vYPdRj60c40C0i1O4MITvI=&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;</span>$LATEST<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;TracingConfig&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Mode&#34;</span>: <span style="color:#e6db74">&#34;PassThrough&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;RevisionId&#34;</span>: <span style="color:#e6db74">&#34;b0813324-c726-481f-b2d3-5a0137e5443b&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;State&#34;</span>: <span style="color:#e6db74">&#34;Active&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastUpdateStatus&#34;</span>: <span style="color:#e6db74">&#34;Successful&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="2-つ目の-s3-バケットへのイベント作成">2 つ目の S3 バケットへのイベント作成</h2>
<h3 id="lambda-function-への権限設定">Lambda Function への権限設定</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws lambda add-permission <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name translate-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --statement-id s3-put-event <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --action lambda:InvokeFunction <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --principal s3.amazonaws.com <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --source-arn arn:aws:s3:::20200510-transcribe-output-mfjt
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Statement&#34;</span>: <span style="color:#e6db74">&#34;{\&#34;Sid\&#34;:\&#34;s3-put-event\&#34;,\&#34;Effect\&#34;:\&#34;Allow\&#34;,\&#34;Principal\&#34;:{\&#34;Service\&#34;:\&#34;s3.amazonaws.com\&#34;},\&#34;Action\&#34;:\&#34;lambda:InvokeFunction\&#34;,\&#34;Resource\&#34;:\&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function\&#34;,\&#34;Condition\&#34;:{\&#34;ArnLike\&#34;:{\&#34;AWS:SourceArn\&#34;:\&#34;arn:aws:s3:::20200510-transcribe-output-mfjt\&#34;}}}&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="s3-へのイベント追加">S3 へのイベント追加</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws s3api put-bucket-notification-configuration <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --bucket 20200510-transcribe-output-mfjt <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --notification-configuration <span style="color:#e6db74">&#39;{&#34;LambdaFunctionConfigurations&#34;: [{&#34;LambdaFunctionArn&#34;: &#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function&#34;, &#34;Events&#34;: [&#34;s3:ObjectCreated:Put&#34;]}]}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws s3api get-bucket-notification-configuration --bucket 20200510-transcribe-input-mfjt
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LambdaFunctionConfigurations&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Id&#34;</span>: <span style="color:#e6db74">&#34;NWRjZTc3NTgtZWE1Ny00NGFlLTliNTctN2I0ZTEwYWI3MjE4&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;LambdaFunctionArn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Events&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;s3:ObjectCreated:Put&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="動作確認">動作確認</h2>
<p>どこで確認すればいいのか分からなかったけれど、CloudWatch Logs で確認できるようだったので今回はそこで。このあたりから CLI 縛りがきつくなってきたので、普通にマネジメントコンソール経由で操作していた。</p>
<pre tabindex="0"><code>[ERROR] TypeError: list indices must be integers or slices, not str
Traceback (most recent call last):
  File &#34;/var/task/translate-function.py&#34;, line 15, in lambda_handler
    input_text = s3_json[&#39;results&#39;][&#39;transcripts&#39;]
</code></pre><p>JSON の配列の参照の仕方が間違っていたので Lambda Function を修正。ついでに翻訳結果のレスポンスも CloudWatch Logs で確認できるように修正{{fn &lsquo;というか、ここまでの構成では確認する術がなかった&rsquo;}}。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python:translate-function.py" data-lang="python:translate-function.py"><span style="display:flex;"><span><span style="color:#f92672">import</span> json
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> urllib.parse
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> boto3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>s3 <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(<span style="color:#e6db74">&#39;s3&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">lambda_handler</span>(event, context):
</span></span><span style="display:flex;"><span>    bucket <span style="color:#f92672">=</span> event[<span style="color:#e6db74">&#39;Records&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;s3&#39;</span>][<span style="color:#e6db74">&#39;bucket&#39;</span>][<span style="color:#e6db74">&#39;name&#39;</span>]
</span></span><span style="display:flex;"><span>    key <span style="color:#f92672">=</span> urllib<span style="color:#f92672">.</span>parse<span style="color:#f92672">.</span>unquote_plus(event[<span style="color:#e6db74">&#39;Records&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;s3&#39;</span>][<span style="color:#e6db74">&#39;object&#39;</span>][<span style="color:#e6db74">&#39;key&#39;</span>], encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;utf-8&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    s3_obj <span style="color:#f92672">=</span> s3<span style="color:#f92672">.</span>get_object(Bucket<span style="color:#f92672">=</span>bucket, Key<span style="color:#f92672">=</span>key)
</span></span><span style="display:flex;"><span>    s3_json <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>loads(s3_obj[<span style="color:#e6db74">&#39;Body&#39;</span>]<span style="color:#f92672">.</span>read())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    translate <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(<span style="color:#e6db74">&#39;translate&#39;</span>)
</span></span><span style="display:flex;"><span>    input_text <span style="color:#f92672">=</span> s3_json[<span style="color:#e6db74">&#39;results&#39;</span>][<span style="color:#e6db74">&#39;transcripts&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;transcript&#39;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    response <span style="color:#f92672">=</span> translate<span style="color:#f92672">.</span>translate_text(
</span></span><span style="display:flex;"><span>        Text <span style="color:#f92672">=</span> input_text,
</span></span><span style="display:flex;"><span>        SourceLanguageCode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;en&#39;</span>,
</span></span><span style="display:flex;"><span>        TargetLanguageCode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;ja&#39;</span>
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    output_text <span style="color:#f92672">=</span> response[<span style="color:#e6db74">&#39;TranslatedText&#39;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    print(output_text)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;statusCode&#39;</span>: <span style="color:#ae81ff">200</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;body&#39;</span>: json<span style="color:#f92672">.</span>dumps({
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#39;output_text&#39;</span>: output_text
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>    }
</span></span></code></pre></div><p>再度 MP3 ファイルを PUT したら、CloudWatch Logs に<q>こんにちは。外国語を話しますか？1つの言語では決して十分ではありません。</q>と出力されたので上手く動いたことが確認できた。</p>
<p>Lambda Function 単体での動作確認は、イベントテンプレートの <samp>s3-put</samp> を流用して以下のようなテストイベントを作成すれば実行できた。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;Records&#34;</span>: [
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;eventVersion&#34;</span>: <span style="color:#e6db74">&#34;2.0&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;eventSource&#34;</span>: <span style="color:#e6db74">&#34;aws:s3&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;awsRegion&#34;</span>: <span style="color:#e6db74">&#34;ap-northeast-1&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;eventTime&#34;</span>: <span style="color:#e6db74">&#34;1970-01-01T00:00:00.000Z&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;eventName&#34;</span>: <span style="color:#e6db74">&#34;ObjectCreated:Put&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;userIdentity&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;principalId&#34;</span>: <span style="color:#e6db74">&#34;EXAMPLE&#34;</span>
</span></span><span style="display:flex;"><span>      },
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;requestParameters&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;sourceIPAddress&#34;</span>: <span style="color:#e6db74">&#34;127.0.0.1&#34;</span>
</span></span><span style="display:flex;"><span>      },
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;responseElements&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;x-amz-request-id&#34;</span>: <span style="color:#e6db74">&#34;EXAMPLE123456789&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;x-amz-id-2&#34;</span>: <span style="color:#e6db74">&#34;EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH&#34;</span>
</span></span><span style="display:flex;"><span>      },
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;s3&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;s3SchemaVersion&#34;</span>: <span style="color:#e6db74">&#34;1.0&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;configurationId&#34;</span>: <span style="color:#e6db74">&#34;testConfigRule&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;bucket&#34;</span>: {
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;20200510-transcribe-output-mfjt&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">&#34;ownerIdentity&#34;</span>: {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;principalId&#34;</span>: <span style="color:#e6db74">&#34;EXAMPLE&#34;</span>
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">&#34;arn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:s3:::20200510-transcribe-output-mfjt&#34;</span>
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;object&#34;</span>: {
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">&#34;key&#34;</span>: <span style="color:#e6db74">&#34;20200510100920_Transcription.json&#34;</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>サーバレスでやっていると、クラウド活用している感がより高まって楽しくなってくる。</p>
]]></content:encoded>
    </item>
    <item>
      <title>JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;LT(オンライン) を CLI でやってみる (ハンズオン 3 編) #jawsug_bgnr</title>
      <link>https://mfjt.jp/diary/2020/05/05/000000/</link>
      <pubDate>Tue, 05 May 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/05/05/000000/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mfjt.jp/diary/2020/05/03/000000/&#34;&gt;ハンズオン 1 編&lt;/a&gt;、&lt;a href=&#34;https://mfjt.jp/diary/2020/05/04/000000/&#34;&gt;ハンズオン 2 編&lt;/a&gt;の続き。&lt;/p&gt;
&lt;h2 id=&#34;s3-バケット作成&#34;&gt;S3 バケット作成&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ aws s3 mb s3://20200505-transcribe-input-mfjt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make_bucket: 20200505-transcribe-input-mfjt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ aws s3 mb s3://20200505-transcribe-output-mfjt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make_bucket: 20200505-transcribe-output-mfjt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;lambda-function-作成&#34;&gt;Lambda Function 作成&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;OutpuBucketName&lt;/code&gt; は自分のバケット名に変更しておく。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python:transcribe-function.py&#34; data-lang=&#34;python:transcribe-function.py&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; urllib.parse
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; boto3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; boto3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;client(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s3&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;transcribe &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; boto3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;client(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;transcribe&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lambda_handler&lt;/span&gt;(event, context):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bucket &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Records&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s3&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bucket&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; urllib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unquote_plus(event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Records&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s3&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;object&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;key&amp;#39;&lt;/span&gt;], encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        transcribe&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;start_transcription_job(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            TranscriptionJobName&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; datetime&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;datetime&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;now()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;strftime(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%Y%m&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%H%M%S&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_Transcription&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            LanguageCode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;en-US&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Media&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;MediaFileUri&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s3://&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; bucket &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            OutputBucketName&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;20200505-transcribe-output-mfjt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(e)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Error getting object &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; from bucket &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;. Make sure they exist and your bucket is in the same region as this function.&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;format(key, bucket))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ロールは相変わらず流用で。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/diary/2020/05/03/000000/">ハンズオン 1 編</a>、<a href="/diary/2020/05/04/000000/">ハンズオン 2 編</a>の続き。</p>
<h2 id="s3-バケット作成">S3 バケット作成</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws s3 mb s3://20200505-transcribe-input-mfjt
</span></span><span style="display:flex;"><span>make_bucket: 20200505-transcribe-input-mfjt
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws s3 mb s3://20200505-transcribe-output-mfjt
</span></span><span style="display:flex;"><span>make_bucket: 20200505-transcribe-output-mfjt
</span></span></code></pre></div><h2 id="lambda-function-作成">Lambda Function 作成</h2>
<p><code>OutpuBucketName</code> は自分のバケット名に変更しておく。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python:transcribe-function.py" data-lang="python:transcribe-function.py"><span style="display:flex;"><span><span style="color:#f92672">import</span> json
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> urllib.parse
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> boto3
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> datetime
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>s3 <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(<span style="color:#e6db74">&#39;s3&#39;</span>)
</span></span><span style="display:flex;"><span>transcribe <span style="color:#f92672">=</span> boto3<span style="color:#f92672">.</span>client(<span style="color:#e6db74">&#39;transcribe&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">lambda_handler</span>(event, context):
</span></span><span style="display:flex;"><span>    bucket <span style="color:#f92672">=</span> event[<span style="color:#e6db74">&#39;Records&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;s3&#39;</span>][<span style="color:#e6db74">&#39;bucket&#39;</span>][<span style="color:#e6db74">&#39;name&#39;</span>]
</span></span><span style="display:flex;"><span>    key <span style="color:#f92672">=</span> urllib<span style="color:#f92672">.</span>parse<span style="color:#f92672">.</span>unquote_plus(event[<span style="color:#e6db74">&#39;Records&#39;</span>][<span style="color:#ae81ff">0</span>][<span style="color:#e6db74">&#39;s3&#39;</span>][<span style="color:#e6db74">&#39;object&#39;</span>][<span style="color:#e6db74">&#39;key&#39;</span>], encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;utf-8&#39;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>        transcribe<span style="color:#f92672">.</span>start_transcription_job(
</span></span><span style="display:flex;"><span>            TranscriptionJobName<span style="color:#f92672">=</span> datetime<span style="color:#f92672">.</span>datetime<span style="color:#f92672">.</span>now()<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#34;%Y%m</span><span style="color:#e6db74">%d</span><span style="color:#e6db74">%H%M%S&#34;</span>) <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;_Transcription&#39;</span>,
</span></span><span style="display:flex;"><span>            LanguageCode<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;en-US&#39;</span>,
</span></span><span style="display:flex;"><span>            Media<span style="color:#f92672">=</span>{
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#39;MediaFileUri&#39;</span>: <span style="color:#e6db74">&#39;s3://&#39;</span> <span style="color:#f92672">+</span> bucket <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;/&#39;</span> <span style="color:#f92672">+</span> key
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>            OutputBucketName<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;20200505-transcribe-output-mfjt&#39;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e:
</span></span><span style="display:flex;"><span>        print(e)
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">&#39;Error getting object </span><span style="color:#e6db74">{}</span><span style="color:#e6db74"> from bucket </span><span style="color:#e6db74">{}</span><span style="color:#e6db74">. Make sure they exist and your bucket is in the same region as this function.&#39;</span><span style="color:#f92672">.</span>format(key, bucket))
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">raise</span> e
</span></span></code></pre></div><p>ロールは相変わらず流用で。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ zip transcribe-function.zip transcribe-function.py
</span></span><span style="display:flex;"><span>  adding: transcribe-function.py <span style="color:#f92672">(</span>deflated 48%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws lambda create-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name transcribe-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --runtime python3.8 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --handler transcribe-function.lambda_handler <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --zip-file fileb://transcribe-function.zip
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionName&#34;</span>: <span style="color:#e6db74">&#34;transcribe-function&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionArn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Runtime&#34;</span>: <span style="color:#e6db74">&#34;python3.8&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Role&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Handler&#34;</span>: <span style="color:#e6db74">&#34;transcribe-function.lambda_handler&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSize&#34;</span>: 667,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Description&#34;</span>: <span style="color:#e6db74">&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Timeout&#34;</span>: 3,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;MemorySize&#34;</span>: 128,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastModified&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T08:36:23.606+0000&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSha256&#34;</span>: <span style="color:#e6db74">&#34;Ce79ystMNCxNtMV5JNg1cBs/wsPQZNBgU/EQ9y7ftIk=&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;</span>$LATEST<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;TracingConfig&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Mode&#34;</span>: <span style="color:#e6db74">&#34;PassThrough&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;RevisionId&#34;</span>: <span style="color:#e6db74">&#34;0406316d-82c6-4c2e-b315-d56b5e1f9ddd&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;State&#34;</span>: <span style="color:#e6db74">&#34;Active&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastUpdateStatus&#34;</span>: <span style="color:#e6db74">&#34;Successful&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="イベント作成">イベント作成</h2>
<p>マネジメントコンソールからの場合は<samp>設計図の使用</samp>からで大丈夫っぽいけど、CLI だと細かく設定が必要らしい。</p>
<h3 id="lambda-function-への権限設定">Lambda Function への権限設定</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws lambda add-permission <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name transcribe-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --statement-id s3-put-event <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --action lambda:InvokeFunction <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --principal s3.amazonaws.com <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --source-arn arn:aws:s3:::20200505-transcribe-input-mfjt
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Statement&#34;</span>: <span style="color:#e6db74">&#34;{\&#34;Sid\&#34;:\&#34;s3-put-event\&#34;,\&#34;Effect\&#34;:\&#34;Allow\&#34;,\&#34;Principal\&#34;:{\&#34;Service\&#34;:\&#34;s3.amazonaws.com\&#34;},\&#34;Action\&#34;:\&#34;lambda:InvokeFunction\&#34;,\&#34;Resource\&#34;:\&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function\&#34;,\&#34;Condition\&#34;:{\&#34;ArnLike\&#34;:{\&#34;AWS:SourceArn\&#34;:\&#34;arn:aws:s3:::20200505-transcribe-input-mfjt\&#34;}}}&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws lambda get-policy --function-name transcribe-function
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Policy&#34;</span>: <span style="color:#e6db74">&#34;{\&#34;Version\&#34;:\&#34;2012-10-17\&#34;,\&#34;Id\&#34;:\&#34;default\&#34;,\&#34;Statement\&#34;:[{\&#34;Sid\&#34;:\&#34;s3-put-event\&#34;,\&#34;Effect\&#34;:\&#34;Allow\&#34;,\&#34;Principal\&#34;:{\&#34;Service\&#34;:\&#34;s3.amazonaws.com\&#34;},\&#34;Action\&#34;:\&#34;lambda:InvokeFunction\&#34;,\&#34;Resource\&#34;:\&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function\&#34;,\&#34;Condition\&#34;:{\&#34;ArnLike\&#34;:{\&#34;AWS:SourceArn\&#34;:\&#34;arn:aws:s3:::20200505-transcribe-input-mfjt\&#34;}}}]}&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;RevisionId&#34;</span>: <span style="color:#e6db74">&#34;be76518e-5680-4436-8c7a-6bc36ee78573&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="s3-へのイベント追加">S3 へのイベント追加</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws s3api put-bucket-notification-configuration <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --bucket 20200505-transcribe-input-mfjt <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --notification-configuration <span style="color:#e6db74">&#39;{&#34;LambdaFunctionConfigurations&#34;: [{&#34;LambdaFunctionArn&#34;: &#34;arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function&#34;, &#34;Events&#34;: [&#34;s3:ObjectCreated:Put&#34;]}]}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws s3api get-bucket-notification-configuration --bucket 20200505-transcribe-input-mfjt
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LambdaFunctionConfigurations&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Id&#34;</span>: <span style="color:#e6db74">&#34;MTlhZThmYTItZGE3Mi00ZTM1LWE2YzktZWFkYjRjM2JmYmRk&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;LambdaFunctionArn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:transcribe-function&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Events&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;s3:ObjectCreated:Put&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="ポリシーのアタッチ">ポリシーのアタッチ</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws iam attach-role-policy <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role-name translate-function-role <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --policy-arn <span style="color:#e6db74">&#34;arn:aws:iam::aws:policy/AmazonS3FullAccess&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws iam attach-role-policy <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role-name translate-function-role <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --policy-arn <span style="color:#e6db74">&#34;arn:aws:iam::aws:policy/AmazonTranscribeFullAccess&#34;</span>
</span></span></code></pre></div><h2 id="動作確認">動作確認</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws s3 cp HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3 s3://20200505-transcribe-input-mfjt
</span></span><span style="display:flex;"><span>upload: ./HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3 to s3://20200505-transcribe-input-mfjt/HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws transcribe list-transcription-jobs
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;TranscriptionJobSummaries&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;TranscriptionJobName&#34;</span>: <span style="color:#e6db74">&#34;20200505090252_Transcription&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;CreationTime&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T18:02:53.280000+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;StartTime&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T18:02:53.325000+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;CompletionTime&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T18:04:52.861000+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;LanguageCode&#34;</span>: <span style="color:#e6db74">&#34;en-US&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;TranscriptionJobStatus&#34;</span>: <span style="color:#e6db74">&#34;COMPLETED&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;OutputLocationType&#34;</span>: <span style="color:#e6db74">&#34;CUSTOMER_BUCKET&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws transcribe get-transcription-job --transcription-job-name 20200505090252_Transcription
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;TranscriptionJob&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;TranscriptionJobName&#34;</span>: <span style="color:#e6db74">&#34;20200505090252_Transcription&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;TranscriptionJobStatus&#34;</span>: <span style="color:#e6db74">&#34;COMPLETED&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;LanguageCode&#34;</span>: <span style="color:#e6db74">&#34;en-US&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;MediaSampleRateHertz&#34;</span>: 44100,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;MediaFormat&#34;</span>: <span style="color:#e6db74">&#34;mp3&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Media&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;MediaFileUri&#34;</span>: <span style="color:#e6db74">&#34;s3://20200505-transcribe-input-mfjt/HelloEnglish-Joanna.0aa7a6dc7f1de9ac48769f366c6f447f9051db57.mp3&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Transcript&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;TranscriptFileUri&#34;</span>: <span style="color:#e6db74">&#34;https://s3.ap-northeast-1.amazonaws.com/20200505-transcribe-output-mfjt/20200505090252_Transcription.json&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;StartTime&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T18:02:53.325000+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;CreationTime&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T18:02:53.280000+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;CompletionTime&#34;</span>: <span style="color:#e6db74">&#34;2020-05-05T18:04:52.861000+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Settings&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;ChannelIdentification&#34;</span>: false,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;ShowAlternatives&#34;</span>: false
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws s3 cp s3://20200505-transcribe-output-mfjt/20200505090252_Transcription.json - | jq <span style="color:#e6db74">&#39;.results | .transcripts&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;transcript&#34;</span>: <span style="color:#e6db74">&#34;Hello. Do you speak a foreign language? One language is never enough.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">]</span>
</span></span></code></pre></div><h2 id="参考">参考</h2>
<ul>
<li><a href="https://dev.classmethod.jp/articles/tips-lambda-eventsource-s3/">【Tips】AWS-CLIでAWS LambdaのイベントソースにS3を設定する | Developers.IO</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;LT(オンライン) を CLI でやってみる (ハンズオン 2 編) #jawsug_bgnr</title>
      <link>https://mfjt.jp/diary/2020/05/04/000000/</link>
      <pubDate>Mon, 04 May 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/05/04/000000/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mfjt.jp/diary/2020/05/03/000000/&#34;&gt;ハンズオン 1 編&lt;/a&gt;の続き。&lt;/p&gt;
&lt;h2 id=&#34;lambda-function-作成&#34;&gt;Lambda Function 作成&lt;/h2&gt;
&lt;p&gt;ロールはハンズオン 1 のときのものを流用する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ zip translate-function-with-apigw.zip translate-function-with-apigw.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  adding: translate-function-with-apigw.py &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;deflated 48%&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ aws lambda create-function &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --function-name translate-function-with-apigw &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --runtime python3.8 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --role &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arn:aws:iam::760182048326:role/translate-function-role&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --handler translate-function-with-apigw.lambda_handler &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --zip-file fileb://translate-function-with-apigw.zip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FunctionName&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;translate-function-with-apigw&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;FunctionArn&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function-with-apigw&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Runtime&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;python3.8&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arn:aws:iam::760182048326:role/translate-function-role&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Handler&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;translate-function-with-apigw.lambda_handler&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CodeSize&amp;#34;&lt;/span&gt;: 462,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Description&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Timeout&amp;#34;&lt;/span&gt;: 3,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;MemorySize&amp;#34;&lt;/span&gt;: 128,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LastModified&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2020-05-04T09:48:09.842+0000&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CodeSha256&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NPM1vqsoCFi8HwNW5DdMNMq6gRWzgV6EA0fcLiVblzE=&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$LATEST&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TracingConfig&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Mode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PassThrough&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RevisionId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cc6b2ba0-eb44-4897-b6c5-1709f8d49ef4&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;State&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Active&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LastUpdateStatus&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Successful&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;api-作成&#34;&gt;API 作成&lt;/h2&gt;
&lt;h3 id=&#34;リソースを作成&#34;&gt;リソースを作成&lt;/h3&gt;
&lt;p&gt;ID も確認する。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/diary/2020/05/03/000000/">ハンズオン 1 編</a>の続き。</p>
<h2 id="lambda-function-作成">Lambda Function 作成</h2>
<p>ロールはハンズオン 1 のときのものを流用する。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ zip translate-function-with-apigw.zip translate-function-with-apigw.py
</span></span><span style="display:flex;"><span>  adding: translate-function-with-apigw.py <span style="color:#f92672">(</span>deflated 48%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws lambda create-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name translate-function-with-apigw <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --runtime python3.8 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --handler translate-function-with-apigw.lambda_handler <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --zip-file fileb://translate-function-with-apigw.zip
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionName&#34;</span>: <span style="color:#e6db74">&#34;translate-function-with-apigw&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionArn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function-with-apigw&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Runtime&#34;</span>: <span style="color:#e6db74">&#34;python3.8&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Role&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Handler&#34;</span>: <span style="color:#e6db74">&#34;translate-function-with-apigw.lambda_handler&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSize&#34;</span>: 462,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Description&#34;</span>: <span style="color:#e6db74">&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Timeout&#34;</span>: 3,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;MemorySize&#34;</span>: 128,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastModified&#34;</span>: <span style="color:#e6db74">&#34;2020-05-04T09:48:09.842+0000&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSha256&#34;</span>: <span style="color:#e6db74">&#34;NPM1vqsoCFi8HwNW5DdMNMq6gRWzgV6EA0fcLiVblzE=&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;</span>$LATEST<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;TracingConfig&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Mode&#34;</span>: <span style="color:#e6db74">&#34;PassThrough&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;RevisionId&#34;</span>: <span style="color:#e6db74">&#34;cc6b2ba0-eb44-4897-b6c5-1709f8d49ef4&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;State&#34;</span>: <span style="color:#e6db74">&#34;Active&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastUpdateStatus&#34;</span>: <span style="color:#e6db74">&#34;Successful&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="api-作成">API 作成</h2>
<h3 id="リソースを作成">リソースを作成</h3>
<p>ID も確認する。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws apigateway create-rest-api --name translate-api
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;xq5is7wlmc&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;translate-api&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;createdDate&#34;</span>: <span style="color:#e6db74">&#34;2020-05-04T19:51:18+09:00&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;apiKeySource&#34;</span>: <span style="color:#e6db74">&#34;HEADER&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;endpointConfiguration&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;types&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;EDGE&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws apigateway get-resources --rest-api-id xq5is7wlmc
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;items&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;ebymz9abo0&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;path&#34;</span>: <span style="color:#e6db74">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="子リソースを作成">子リソースを作成</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws apigateway create-resource <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --rest-api-id xq5is7wlmc <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --parent-id ebymz9abo0 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --path-part translate
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;k8hfnw&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;parentId&#34;</span>: <span style="color:#e6db74">&#34;ebymz9abo0&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;pathPart&#34;</span>: <span style="color:#e6db74">&#34;translate&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;path&#34;</span>: <span style="color:#e6db74">&#34;/translate&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="メソッドを作成">メソッドを作成</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws apigateway put-method <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --rest-api-id xq5is7wlmc <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --resource-id k8hfnw <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --http-method GET <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --authorization-type NONE
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;httpMethod&#34;</span>: <span style="color:#e6db74">&#34;GET&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;authorizationType&#34;</span>: <span style="color:#e6db74">&#34;NONE&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;apiKeyRequired&#34;</span>: false
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws apigateway put-integration <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --rest-api-id xq5is7wlmc <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --resource-id k8hfnw <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --http-method GET <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --type AWS_PROXY <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --integration-http-method POST <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --uri <span style="color:#e6db74">&#34;arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function-with-apigw/invocations&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;AWS_PROXY&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;httpMethod&#34;</span>: <span style="color:#e6db74">&#34;POST&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;uri&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function-with-apigw/invocations&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;passthroughBehavior&#34;</span>: <span style="color:#e6db74">&#34;WHEN_NO_MATCH&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;timeoutInMillis&#34;</span>: 29000,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;cacheNamespace&#34;</span>: <span style="color:#e6db74">&#34;k8hfnw&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;cacheKeyParameters&#34;</span>: <span style="color:#f92672">[]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws apigateway put-method-response <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --rest-api-id xq5is7wlmc <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --resource-id k8hfnw <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --http-method GET <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --status-code <span style="color:#ae81ff">200</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --response-models <span style="color:#e6db74">&#39;{&#34;application/json&#34;: &#34;Empty&#34;}&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;statusCode&#34;</span>: <span style="color:#e6db74">&#34;200&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;responseModels&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;application/json&#34;</span>: <span style="color:#e6db74">&#34;Empty&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="api-gateway-への-権限付与">API Gateway への 権限付与</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws lambda add-permission <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name translate-function-with-apigw <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --statement-id 72e0a706-02e8-479f-affb-0a2dcc5d4a29 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --action <span style="color:#e6db74">&#34;lambda:InvokeFunction&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --principal apigateway.amazonaws.com
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Statement&#34;</span>: <span style="color:#e6db74">&#34;{\&#34;Sid\&#34;:\&#34;72e0a706-02e8-479f-affb-0a2dcc5d4a29\&#34;,\&#34;Effect\&#34;:\&#34;Allow\&#34;,\&#34;Principal\&#34;:{\&#34;Service\&#34;:\&#34;apigateway.amazonaws.com\&#34;},\&#34;Action\&#34;:\&#34;lambda:InvokeFunction\&#34;,\&#34;Resource\&#34;:\&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function-with-apigw\&#34;}&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="デプロイ">デプロイ</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws apigateway create-deployment <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --rest-api-id xq5is7wlmc <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --stage-name dev
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;hq4jn2&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;createdDate&#34;</span>: <span style="color:#e6db74">&#34;2020-05-04T20:08:33+09:00&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="動作確認">動作確認</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ curl https://xq5is7wlmc.execute-api.ap-northeast-1.amazonaws.com/dev/translate?input_text<span style="color:#f92672">=</span>%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEAPI%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A7%E3%81%99
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span><span style="color:#e6db74">&#34;output_text&#34;</span>: <span style="color:#e6db74">&#34;This is my first API call&#34;</span><span style="color:#f92672">}</span>
</span></span></code></pre></div><hr>
<h2 id="所感">所感</h2>
<ul>
<li>メソッド作成時、<samp>統合タイプ</samp>が <samp>Lambda 関数</samp> にはなっているものの、<samp>Lambda プロキシ統合の使用</samp>が有効になっていないがためにきちんと動かず結構詰まった
<ul>
<li><code>put-integration</code> の <code>type</code> は <code>AWS_PROXY</code> にする</li>
</ul>
</li>
<li>マネジメントコンソールから作った API と同じになるように <code>put-integration</code> やら <code>put-method-response</code> をとりあえず実行したので、そのあたりの本質はまだ理解できていない</li>
</ul>
<h2 id="参考">参考</h2>
<ul>
<li><a href="https://dev.classmethod.jp/articles/getting-started-with-api-gateway-lambda-integration/">API GatewayのLambda連携をAWS CLIからやってみる | Developers.IO</a></li>
<li><a href="https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html">API Gateway で Lambda プロキシ統合をセットアップする - Amazon API Gateway</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;LT(オンライン) を CLI でやってみる (ハンズオン 1 編) #jawsug_bgnr</title>
      <link>https://mfjt.jp/diary/2020/05/03/000000/</link>
      <pubDate>Sun, 03 May 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/05/03/000000/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://jawsug-bgnr.connpass.com/event/172979/&#34;&gt;JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;amp;LT(オンライン)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在宅勤務ベースになってオンラインのイベントに参加しやすくなっているので色々手を出している。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<ul>
<li><a href="https://jawsug-bgnr.connpass.com/event/172979/">JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;LT(オンライン)</a></li>
</ul>
<p>在宅勤務ベースになってオンラインのイベントに参加しやすくなっているので色々手を出している。</p>
<p>先日は <a href="https://jawsug-bgnr.connpass.com/event/172979/">JAWS-UG 初心者支部＆千葉支部 #26 新人さん歓迎！ハンズオン&amp;LT(オンライン)</a> に参加して、へーとかほーとか思いながら Lambda やら API Gateway やらを触った (Translate と Transcribe はサービスそのものを初めて知った)。</p>
<p>当日は資料通りにマネジメントコンソールから操作していたが、復習の意味も込めて CLI 経由で改めてやってみる。</p>
<h2 id="ロール作成">ロール作成</h2>
<p>とりあえずフル権限で作成。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json:translate-function-role.json" data-lang="json:translate-function-role.json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;2012-10-17&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;Statement&#34;</span>: [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;Effect&#34;</span>: <span style="color:#e6db74">&#34;Allow&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;Principal&#34;</span>: {
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">&#34;Service&#34;</span>: <span style="color:#e6db74">&#34;lambda.amazonaws.com&#34;</span>
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">&#34;Action&#34;</span>: <span style="color:#e6db74">&#34;sts:AssumeRole&#34;</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws iam create-role <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role-name translate-function-role <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --assume-role-policy-document file://translate-function-role.json
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Role&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Path&#34;</span>: <span style="color:#e6db74">&#34;/&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;RoleName&#34;</span>: <span style="color:#e6db74">&#34;translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;RoleId&#34;</span>: <span style="color:#e6db74">&#34;AROA3B7TBQZDJUTAZJSOD&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Arn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;CreateDate&#34;</span>: <span style="color:#e6db74">&#34;2020-05-03T07:39:02+00:00&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;AssumeRolePolicyDocument&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;2012-10-17&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Statement&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;Effect&#34;</span>: <span style="color:#e6db74">&#34;Allow&#34;</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;Principal&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#e6db74">&#34;Service&#34;</span>: <span style="color:#e6db74">&#34;lambda.amazonaws.com&#34;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;Action&#34;</span>: <span style="color:#e6db74">&#34;sts:AssumeRole&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>ロールが何のためのものかは <a href="https://qiita.com/YumaInaura/items/343cbfe3c62005710b26">#AWS Lambda の実行ロールを作成する ( SQSの実行権限を与える例 )</a> の内容がしっくりきた。</p>
<blockquote cite="https://qiita.com/YumaInaura/items/343cbfe3c62005710b26" title="#AWS Lambda の実行ロールを作成する ( SQSの実行権限を与える例 )">
  <p>AWS Lambda 「が」AWSの他のサービス「を」使うときの許可、ポリシーみたいだ。</p>
</blockquote>
<h2 id="lambda-function-を作成">Lambda Function を作成</h2>
<p>今回は<a href="https://github.com/ketancho/aws-serverless-quick-start-hands-on">サンプルコード</a>を clone してそのまま使用した。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ zip translate-function.zip translate-function.py
</span></span><span style="display:flex;"><span>  adding: translate-function.py <span style="color:#f92672">(</span>deflated 42%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws lambda create-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --function-name translate-function <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --runtime python3.8 <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --handler translate-function.lambda_handler <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --zip-file fileb://translate-function.zip
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionName&#34;</span>: <span style="color:#e6db74">&#34;translate-function&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionArn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:lambda:ap-northeast-1:760182048326:function:translate-function&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Runtime&#34;</span>: <span style="color:#e6db74">&#34;python3.8&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Role&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Handler&#34;</span>: <span style="color:#e6db74">&#34;translate-function.lambda_handler&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSize&#34;</span>: 454,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Description&#34;</span>: <span style="color:#e6db74">&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Timeout&#34;</span>: 3,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;MemorySize&#34;</span>: 128,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastModified&#34;</span>: <span style="color:#e6db74">&#34;2020-05-03T08:01:57.762+0000&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;CodeSha256&#34;</span>: <span style="color:#e6db74">&#34;undpq1zH+AaJrMaEzHNUAws+D0+g5+6puU/1ieb62kQ=&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;</span>$LATEST<span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;TracingConfig&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Mode&#34;</span>: <span style="color:#e6db74">&#34;PassThrough&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;RevisionId&#34;</span>: <span style="color:#e6db74">&#34;17bfdf82-b17c-4a62-b70d-85a71d735432&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;State&#34;</span>: <span style="color:#e6db74">&#34;Active&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LastUpdateStatus&#34;</span>: <span style="color:#e6db74">&#34;Successful&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>実行してみると、</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws lambda invoke --function-name translate-function outfile.json
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;StatusCode&#34;</span>: 200,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;FunctionError&#34;</span>: <span style="color:#e6db74">&#34;Unhandled&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;ExecutedVersion&#34;</span>: <span style="color:#e6db74">&#34;</span>$LATEST<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p><code>FunctionError</code> らしい。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json:output.json" data-lang="json:output.json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;errorMessage&#34;</span>: <span style="color:#e6db74">&#34;An error occurred (AccessDeniedException) when calling the TranslateText operation: User: arn:aws:sts::760182048326:assumed-role/translate-function-role/translate-function is not authorized to perform: translate:TranslateText&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;errorType&#34;</span>: <span style="color:#e6db74">&#34;ClientError&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;stackTrace&#34;</span>: [
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;  File \&#34;/var/task/translate-function.py\&#34;, line 9, in lambda_handler\n    response = translate.translate_text(\n&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;  File \&#34;/var/runtime/botocore/client.py\&#34;, line 316, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;  File \&#34;/var/runtime/botocore/client.py\&#34;, line 626, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n&#34;</span>
</span></span><span style="display:flex;"><span>  ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Amazon Translate のポリシーをアタッチするのを忘れていた。</p>
<h2 id="仕切り直し">仕切り直し</h2>
<p>TranslateFullAccess をアタッチ。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws iam attach-role-policy <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --role-name translate-function-role <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --policy-arn <span style="color:#e6db74">&#34;arn:aws:iam::aws:policy/TranslateFullAccess&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ aws iam get-role --role-name translate-function-role
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Role&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Path&#34;</span>: <span style="color:#e6db74">&#34;/&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;RoleName&#34;</span>: <span style="color:#e6db74">&#34;translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;RoleId&#34;</span>: <span style="color:#e6db74">&#34;AROA3B7TBQZDJUTAZJSOD&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;Arn&#34;</span>: <span style="color:#e6db74">&#34;arn:aws:iam::760182048326:role/translate-function-role&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;CreateDate&#34;</span>: <span style="color:#e6db74">&#34;2020-05-03T07:39:02+00:00&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;AssumeRolePolicyDocument&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Version&#34;</span>: <span style="color:#e6db74">&#34;2012-10-17&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Statement&#34;</span>: <span style="color:#f92672">[</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;Effect&#34;</span>: <span style="color:#e6db74">&#34;Allow&#34;</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;Principal&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#e6db74">&#34;Service&#34;</span>: <span style="color:#e6db74">&#34;lambda.amazonaws.com&#34;</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>                    <span style="color:#e6db74">&#34;Action&#34;</span>: <span style="color:#e6db74">&#34;sts:AssumeRole&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;MaxSessionDuration&#34;</span>: 3600,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;RoleLastUsed&#34;</span>: <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;LastUsedDate&#34;</span>: <span style="color:#e6db74">&#34;2020-05-03T08:06:35+00:00&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;Region&#34;</span>: <span style="color:#e6db74">&#34;ap-northeast-1&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>Lambda Function を改めて実行。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ aws lambda invoke --function-name translate-function outfile.json
</span></span><span style="display:flex;"><span><span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;StatusCode&#34;</span>: 200,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;ExecutedVersion&#34;</span>: <span style="color:#e6db74">&#34;</span>$LATEST<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>今度は成功した。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json:output.json" data-lang="json:output.json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;statusCode&#34;</span>: <span style="color:#ae81ff">200</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;body&#34;</span>: <span style="color:#e6db74">&#34;{\&#34;output_text\&#34;: \&#34;Are you well?\&#34;}&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="参考">参考</h2>
<ul>
<li><a href="https://genzouw.com/entry/2019/02/26/075959">AWSのLambdaファンクションの作成、実行、削除をコマンドラインから操作する</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Zabbix の練習</title>
      <link>https://mfjt.jp/diary/2020/04/19/000000/</link>
      <pubDate>Sun, 19 Apr 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/04/19/000000/</guid>
      <description>&lt;p&gt;構築済みの環境で監視をちょこちょこ触ることはあったけど、設定からやる必要が出てきたので、Docker でサクッと環境作って練習。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone -b 3.0 git@github.com:zabbix/zabbix-docker.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ldquo;docker-compose_v3_alpine_mysql_latest.yaml&amp;rdquo; をベースに、とりあえず動かせるように &amp;ldquo;docker-compose.yaml&amp;rdquo; を作成。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>構築済みの環境で監視をちょこちょこ触ることはあったけど、設定からやる必要が出てきたので、Docker でサクッと環境作って練習。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git clone -b 3.0 git@github.com:zabbix/zabbix-docker.git
</span></span></code></pre></div><p>&ldquo;docker-compose_v3_alpine_mysql_latest.yaml&rdquo; をベースに、とりあえず動かせるように &ldquo;docker-compose.yaml&rdquo; を作成。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">version</span>: <span style="color:#e6db74">&#34;3.5&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">services</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">zabbix-server</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">zabbix/zabbix-server-mysql:alpine-3.0-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;10051:10051&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/etc/timezone:/etc/timezone:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/snmptraps:/var/lib/zabbix/snmptraps:ro</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">links</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">mysql-server:mysql-server</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ulimits</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">nproc</span>: <span style="color:#ae81ff">65535</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">nofile</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">soft</span>: <span style="color:#ae81ff">20000</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">hard</span>: <span style="color:#ae81ff">40000</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">DB_SERVER_HOST=mysql-server</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_USER=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_PASSWORD=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_DATABASE=zabbix</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">user</span>: <span style="color:#ae81ff">root</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">mysql-server</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">zbx_net_backend</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">aliases</span>:
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-server</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-server-mysql</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-server-alpine-mysql</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-server-mysql-alpine</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">zbx_net_frontend</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">stop_grace_period</span>: <span style="color:#ae81ff">30s</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">sysctls</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">net.ipv4.ip_local_port_range=1024 65000</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">net.ipv4.conf.all.accept_redirects=0</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">net.ipv4.conf.all.secure_redirects=0</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">net.ipv4.conf.all.send_redirects=0</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.description</span>: <span style="color:#e6db74">&#34;Zabbix server with MySQL database support&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.company</span>: <span style="color:#e6db74">&#34;Zabbix LLC&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.component</span>: <span style="color:#e6db74">&#34;zabbix-server&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.dbtype</span>: <span style="color:#e6db74">&#34;mysql&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.os</span>: <span style="color:#e6db74">&#34;alpine&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">zabbix-web-nginx-mysql</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">zabbix/zabbix-web-nginx-mysql:alpine-3.0-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;80:80&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;443:443&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">links</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">mysql-server:mysql-server</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">zabbix-server:zabbix-server</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/etc/timezone:/etc/timezone:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">ZBX_SERVER_HOST=zabbix-server</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">DB_SERVER_HOST=mysql-server</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_USER=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_PASSWORD=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_DATABASE=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">PHP_TZ=Asia/Tokyo</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">user</span>: <span style="color:#ae81ff">root</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">mysql-server</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">zabbix-server</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">healthcheck</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">test</span>: [<span style="color:#e6db74">&#34;CMD&#34;</span>, <span style="color:#e6db74">&#34;curl&#34;</span>, <span style="color:#e6db74">&#34;-f&#34;</span>, <span style="color:#e6db74">&#34;http://localhost&#34;</span>]
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">interval</span>: <span style="color:#ae81ff">10s</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">timeout</span>: <span style="color:#ae81ff">5s</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">retries</span>: <span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">zbx_net_backend</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">aliases</span>:
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-web-nginx-mysql</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-web-nginx-alpine-mysql</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-web-nginx-mysql-alpine</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">zbx_net_frontend</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">stop_grace_period</span>: <span style="color:#ae81ff">10s</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">sysctls</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">net.core.somaxconn=65535</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.description</span>: <span style="color:#e6db74">&#34;Zabbix frontend on Nginx web-server with MySQL database support&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.company</span>: <span style="color:#e6db74">&#34;Zabbix LLC&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.component</span>: <span style="color:#e6db74">&#34;zabbix-frontend&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.webserver</span>: <span style="color:#e6db74">&#34;nginx&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.dbtype</span>: <span style="color:#e6db74">&#34;mysql&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.os</span>: <span style="color:#e6db74">&#34;alpine&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">zabbix-agent</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">zabbix/zabbix-agent:alpine-3.0-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">hostname</span>: <span style="color:#ae81ff">zabbix-agent</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;10050:10050&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">/etc/timezone:/etc/timezone:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">links</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">zabbix-server:zabbix-server</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">ZBX_SERVER_HOST=zabbix-server</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">user</span>: <span style="color:#ae81ff">root</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">privileged</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">pid</span>: <span style="color:#e6db74">&#34;host&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">zbx_net_backend</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">aliases</span>:
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-agent</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-agent-passive</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-agent-alpine</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">stop_grace_period</span>: <span style="color:#ae81ff">5s</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.description</span>: <span style="color:#e6db74">&#34;Zabbix agent&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.company</span>: <span style="color:#e6db74">&#34;Zabbix LLC&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.component</span>: <span style="color:#e6db74">&#34;zabbix-agentd&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.zabbix.os</span>: <span style="color:#e6db74">&#34;alpine&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">mysql-server</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">mysql:5.7</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">command</span>: [<span style="color:#ae81ff">mysqld, --character-set-server=utf8, --collation-server=utf8_bin, --default-authentication-plugin=mysql_native_password]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>       - <span style="color:#ae81ff">./zbx_env/var/lib/mysql:/var/lib/mysql:rw</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_ROOT_PASSWORD=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_DATABASE=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_USER=zabbix</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">MYSQL_PASSWORD=zabbix</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">user</span>: <span style="color:#ae81ff">root</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">stop_grace_period</span>: <span style="color:#ae81ff">1m</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">zbx_net_backend</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">aliases</span>:
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">mysql-server</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">zabbix-database</span>
</span></span><span style="display:flex;"><span>          - <span style="color:#ae81ff">mysql-database</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">db_data_mysql</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">image</span>: <span style="color:#ae81ff">busybox</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">./zbx_env/var/lib/mysql:/var/lib/mysql:rw</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">zbx_net_frontend</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">driver</span>: <span style="color:#ae81ff">bridge</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">driver_opts</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.docker.network.enable_ipv6</span>: <span style="color:#e6db74">&#34;false&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ipam</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">driver</span>: <span style="color:#ae81ff">default</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">config</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">subnet</span>: <span style="color:#ae81ff">172.16.238.0</span><span style="color:#ae81ff">/24</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">zbx_net_backend</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">driver</span>: <span style="color:#ae81ff">bridge</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">driver_opts</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">com.docker.network.enable_ipv6</span>: <span style="color:#e6db74">&#34;false&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">internal</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">ipam</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">driver</span>: <span style="color:#ae81ff">default</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">config</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">subnet</span>: <span style="color:#ae81ff">172.16.239.0</span><span style="color:#ae81ff">/24</span>
</span></span></code></pre></div><div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B07TX5FXS5?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B07TX5FXS5.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B07TX5FXS5?tag=mfjt-22">［改訂3版］Zabbix統合監視実践入門 ―障害通知，傾向分析，可視化による省力運用 Software Design plus</a></div>
  </div>
]]></content:encoded>
    </item>
    <item>
      <title>楽天モバイル 無料サポータープログラムで 1 ヶ月過ごしてみて</title>
      <link>https://mfjt.jp/diary/2020/03/01/000000/</link>
      <pubDate>Sun, 01 Mar 2020 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2020/03/01/000000/</guid>
      <description>&lt;p&gt;一次落選組が二次で契約した。2 月 8 日からなので厳密には 1 ヶ月ではない。&lt;/p&gt;



&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://mfjt.jp/diary/2020/2020-03-01_hu_81fe1063099f7f54.webp&#34;/&gt; 
&lt;/figure&gt;

&lt;h2 id=&#34;回線&#34;&gt;回線&lt;/h2&gt;
&lt;p&gt;自宅とか仕事場とか、わしの生活圏では「ここはダメだろうな」というところ以外は案外問題なく繋がったし、テザリングメインで使って速度を不満に感じることはなかった。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>一次落選組が二次で契約した。2 月 8 日からなので厳密には 1 ヶ月ではない。</p>



<figure>
    <img loading="lazy" src="/diary/2020/2020-03-01_hu_81fe1063099f7f54.webp"/> 
</figure>

<h2 id="回線">回線</h2>
<p>自宅とか仕事場とか、わしの生活圏では「ここはダメだろうな」というところ以外は案外問題なく繋がったし、テザリングメインで使って速度を不満に感じることはなかった。</p>
<p>ただし、普段のドコモ回線に慣れてしまった身としては繋がらないエリアの広さがネックで、楽天モバイルをメインにするという判断を現時点で下すのは難しい。</p>
<h2 id="端末">端末</h2>
<p>小さい端末好きとしては Rakuten Mini 以外の選択肢はなかった。Rakuten Mini をしばらく触った後だと、メイン機の Xperia XZ1 Compact ですら「何このデカい板きれ」と思ってしまうくらいにはインパクトがある。</p>
<p>QWERTY 入力はさすがに難儀するけど、FeliCa も乗っているし、バッテリーの保ちさえなんとかなってくれればメイン機にしてもいいと思える出来ではある。バッテリーさえなんとかなってくれれば……</p>
<h2 id="総評">総評</h2>
<p>無料サポータープログラム期間はありがたく使わせてもらうけど、終わったら解約すると思う。</p>
<p>一時的にテザリングしまくるような生活をしているけれど、普段はそんなことないので回線を維持しておく必要が全くないし、かといってメイン回線化するかというと言わずもがな。</p>
]]></content:encoded>
    </item>
    <item>
      <title>自宅 PC を新調した</title>
      <link>https://mfjt.jp/diary/2019/09/15/000000/</link>
      <pubDate>Sun, 15 Sep 2019 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2019/09/15/000000/</guid>
      <description>&lt;!-- {{/* &lt; x user=&#34;mfjt&#34; id=&#34;1165627522718957568&#34; &gt; */}} --&gt;
&lt;!-- {{/* &lt; x user=&#34;mfjt&#34; id=&#34;1165628993678147585&#34; &gt; */}} --&gt;
&lt;p&gt;ということで、8 月最後の週末にアキバで買い込んできて組んだ。AMD は Athlon II X4 以来振り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07MTRXVR7?tag=mfjt-22&#34;&gt;ASRock DeskMini A300&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07MK39X9L?tag=mfjt-22&#34;&gt;DESKMINI 2XUSB2.0 CABLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B079D8FD28?tag=mfjt-22&#34;&gt;AMD Ryzen 2400G&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07F2JFTZ9?tag=mfjt-22&#34;&gt;SanMax SMD4-S16G48M-26V-D&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B078VBL3T9?tag=mfjt-22&#34;&gt;Intel 760P 256 GB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CPU は 3400G とギリギリまで迷ったけど、最終的には値段差だけのメリットもないと判断して 2400G にした。正直なところ先代の Core i5 4590T で困ってないくらいだったし、結果的にこれで良かったと思っている。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- {{/* < x user="mfjt" id="1165627522718957568" > */}} -->
<!-- {{/* < x user="mfjt" id="1165628993678147585" > */}} -->
<p>ということで、8 月最後の週末にアキバで買い込んできて組んだ。AMD は Athlon II X4 以来振り。</p>
<ul>
<li><a href="https://www.amazon.co.jp/dp/B07MTRXVR7?tag=mfjt-22">ASRock DeskMini A300</a></li>
<li><a href="https://www.amazon.co.jp/dp/B07MK39X9L?tag=mfjt-22">DESKMINI 2XUSB2.0 CABLE</a></li>
<li><a href="https://www.amazon.co.jp/dp/B079D8FD28?tag=mfjt-22">AMD Ryzen 2400G</a></li>
<li><a href="https://www.amazon.co.jp/dp/B07F2JFTZ9?tag=mfjt-22">SanMax SMD4-S16G48M-26V-D</a></li>
<li><a href="https://www.amazon.co.jp/dp/B078VBL3T9?tag=mfjt-22">Intel 760P 256 GB</a></li>
</ul>
<p>CPU は 3400G とギリギリまで迷ったけど、最終的には値段差だけのメリットもないと判断して 2400G にした。正直なところ先代の Core i5 4590T で困ってないくらいだったし、結果的にこれで良かったと思っている。</p>
<p>サンマックス信者なのでメモリはこれ一択。</p>
<p>ストレージは NVMe デビューしてみたけど、もはやメーカーの善し悪しもよく分からないので安パイっぽいインテルを選んだ。</p>
<p>DeskMini A300、レビューを見て覚悟はしていたがファンがそれなりにうるさい。それ以外は今のところ不満らしい不満もないので、コンパクトなのを組みたい人にはおすすめ。がっつりゲームは厳しいだろうけど、わしが唯一やるゲームの Rocksmith はフル HD でスムーズに動いており、気持ちよくプレイできるようになった<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>先代マシンはグラフィックが弱いせいか、解像度落としてもかくかく気味だった&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>NAS と UPS をつないだ</title>
      <link>https://mfjt.jp/diary/2019/06/30/000000/</link>
      <pubDate>Sun, 30 Jun 2019 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2019/06/30/000000/</guid>
      <description>&lt;p&gt;オムロンの &lt;a href=&#34;https://www.amazon.co.jp/dp/B000KRNOHO?tag=mfjt-22&#34;&gt;BY50FW&lt;/a&gt; という UPS を録画サーバ用に使っていたが、録画サーバも退役させたので Synology の NAS につなげて使っていた。ただし、NAS がオムロンの UPS に対応していなかったので、単なるバッテリーとして。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>オムロンの <a href="https://www.amazon.co.jp/dp/B000KRNOHO?tag=mfjt-22">BY50FW</a> という UPS を録画サーバ用に使っていたが、録画サーバも退役させたので Synology の NAS につなげて使っていた。ただし、NAS がオムロンの UPS に対応していなかったので、単なるバッテリーとして。</p>
<p>最近ふと<a href="https://www.synology.com/ja-jp/compatibility?search_by=products&amp;category=upses&amp;filter_brand=Omron&amp;p=1">互換性リスト</a>を見ると、BY50FW こそないものの、オムロンの UPS が載っていたので試しに USB をつないでみたらちゃんと認識してくれた。</p>



<figure>
    <img loading="lazy" src="/diary/2019/2019-06-30_hu_92df58c67e0f2fcb.webp"/> 
</figure>

<p>UPS を買ってから 10 年くらいバッテリー交換してないから、気休めにもならないかもしれない。</p>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B01BNPT1EG?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B01BNPT1EG.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B01BNPT1EG?tag=mfjt-22">DS216j [DiskStation 2ベイ NAS デュアルコアCPU SATA対応]</a></div>
  </div>
<ins datetime="2019-09-28T12:00:00+09:00">
<p>バッテリー交換の赤ランプが点灯し始めたのでバッテリーを交換した。</p>



<figure>
    <img loading="lazy" src="/diary/2019/2019-06-30_hu_ca72f7f2780b29cd.webp"/> 
</figure>

<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B0007NXT3K?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B0007NXT3K.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B0007NXT3K?tag=mfjt-22">オムロン BXB50F BX35F/BX50F/BX50FW用交換バッテリ</a></div>
  </div>
</ins>
]]></content:encoded>
    </item>
    <item>
      <title>AWS 認定ソリューションアーキテクト - アソシエイト合格</title>
      <link>https://mfjt.jp/diary/2019/04/30/000000/</link>
      <pubDate>Tue, 30 Apr 2019 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2019/04/30/000000/</guid>
      <description>&lt;p&gt;去年の 12 月頭から勉強を始め、だらだら勉強して 4 月末に合格した。&lt;/p&gt;
&lt;h2 id=&#34;書籍&#34;&gt;書籍&lt;/h2&gt;
&lt;p&gt;勉強始めたタイミングでは、対策本は『合格対策 AWS認定ソリューションアーキテクト - アソシエイト』の 1 冊しかなかったので必然的にこれに。そのちょっと後に『合格対策 AWS認定ソリューションアーキテクト - アソシエイト』が出たので、最新情報追従のために買った。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>去年の 12 月頭から勉強を始め、だらだら勉強して 4 月末に合格した。</p>
<h2 id="書籍">書籍</h2>
<p>勉強始めたタイミングでは、対策本は『合格対策 AWS認定ソリューションアーキテクト - アソシエイト』の 1 冊しかなかったので必然的にこれに。そのちょっと後に『合格対策 AWS認定ソリューションアーキテクト - アソシエイト』が出たので、最新情報追従のために買った。</p>
<p>前者の方が少し平易な気がしたが、今からなら後者だけでも良いかもしれない。</p>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/486594043X?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/486594043X.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/486594043X?tag=mfjt-22">合格対策 AWS認定ソリューションアーキテクト - アソシエイト</a></div>
  </div>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/4295005495?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/4295005495.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/4295005495?tag=mfjt-22">徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書</a></div>
  </div>
<h2 id="ハンズオン">ハンズオン</h2>
<p>どこかで紹介されていた Udemy の『<a href="https://www.udemy.com/share/1013iY/">手を動かしながら2週間で学ぶ AWS 基本から応用まで</a>』が良さげだったので、正月休み + α を使ってこなした。</p>
<p>本で多少知識は吸収したものの、何をどうやって触ればという状態だったので、主要サービスの使い方を体系だって学びたいというニーズに対しては非常に良かった。直接的な試験対策とはならないかもしれないけど、机上学習だけだとさすがにつらいし。</p>
<p>普通に買うと ¥ 15,600 だったけど、Udemy のセールを狙って ¥ 1,300 で買った。後から知ったけど、<a href="https://www.ketancho.net/entry/2018/09/03/074115">講師のブログ</a>では ¥ 1,200 で買えるクーポンを常時配っているのでこっちがおすすめ。</p>
<h2 id="web-問題集">Web 問題集</h2>
<p>おなじみの『<a href="https://aws.koiwaclub.com/">AWS WEB問題集で学習しよう</a>』のゴールドプランに登録して、通勤中をメインにちまちまやっていた。後から考えると、合格に役立ったのは間違いないけど、何を問うてる問題なのか分からないのがあったりするのは「うーん」という感じ<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。</p>
<h2 id="公式模試">公式模試</h2>
<p>分野毎の得点率がかなりバラついているものの、一応合格圏っぽい点数は取れた。金掛かるけどとりあえず受けとけ。</p>
<blockquote>
<pre tabindex="0"><code>総合スコア:  80%

トピックレベルスコア:
1.0  Design Resilient Architectures: 100%
2.0  Define Performant Architectures: 57%
3.0  Specify Secure Applications and Architectures: 83%
4.0  Design Cost-Optimized Architectures: 50%
5.0  Define Operationally-Excellent Architectures: 100%
</code></pre></blockquote>
<h2 id="本試験">本試験</h2>
<p>最初は年度内には片付けたいと思い 3 月末に予約を入れたが、行きたいライブの予定ができたり、インフルにかかったりで 4 月末に受験してきた。</p>
<p>結果は、720 点ボーダーのところを 726 点でギリギリ合格。一通り問題を解いて、もう一周見直してもなお 1 時間くらい時間が余っているくらいではあったけど、手も足も出ない問題があったり、上辺しか分かってないところが多かったのが原因だろうと思う。</p>
<table>
  <thead>
      <tr>
          <th>セクション</th>
          <th>評価</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>分野 1: 回復性の高いアーキテクチャを設計する</td>
          <td>再学習の必要あり</td>
      </tr>
      <tr>
          <td>分野 2: パフォーマンスに優れたアーキテクチャを定義する</td>
          <td>再学習の必要あり</td>
      </tr>
      <tr>
          <td>分野 3: セキュアなアプリケーションおよびアーキテクチャを規定する</td>
          <td>再学習の必要あり</td>
      </tr>
      <tr>
          <td>分野 4: コスト最適化アーキテクチャを設計する</td>
          <td>十分な知識を有する</td>
      </tr>
      <tr>
          <td>分野 5: オペレーショナルエクセレンスを備えたアーキテクチャを定義する</td>
          <td>十分な知識を有する</td>
      </tr>
  </tbody>
</table>
<p>仕事でやってるのが<strong>どレガシー</strong>な内容なので、ちっとは業務でもくらうどとかやりたいけど難しそうやなぁ……</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>本家のテスト準拠?&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>WSL 上の Docker CLI から Docker for Windows を使う</title>
      <link>https://mfjt.jp/diary/2019/01/04/000000/</link>
      <pubDate>Fri, 04 Jan 2019 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2019/01/04/000000/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mfjt.jp/diary/2016/02/20/000000/&#34;&gt;2 年前に買った本&lt;/a&gt;で Docker の勉強を始めた。仕事だけだと最近の技術をキャッチアップできず、さすがに危機感を覚えてきた。&lt;/p&gt;
&lt;p&gt;できれば WSL だけで完結する環境にしたいけど、&lt;a href=&#34;https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87&#34;&gt;WSL を管理者権限で起動させる必要がある&lt;/a&gt;のが嫌だったので、WSL に Docker CLI を入れて、そこから Docker for Windows を操作するようにした。これを書いている時点は以下のバージョンだった。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/diary/2016/02/20/000000/">2 年前に買った本</a>で Docker の勉強を始めた。仕事だけだと最近の技術をキャッチアップできず、さすがに危機感を覚えてきた。</p>
<p>できれば WSL だけで完結する環境にしたいけど、<a href="https://qiita.com/yanoshi/items/dcecbf117d9cbd14af87">WSL を管理者権限で起動させる必要がある</a>のが嫌だったので、WSL に Docker CLI を入れて、そこから Docker for Windows を操作するようにした。これを書いている時点は以下のバージョンだった。</p>
<ul>
<li>Windows 10 Pro 1803
<ul>
<li>Docker for Windows 2.0.0.0-win81</li>
</ul>
</li>
<li>Ubuntu 18.04 LTS on WSL
<ul>
<li>Docker CLI 18.09.0</li>
</ul>
</li>
</ul>
<h2 id="docker-for-windows-のインストール">Docker for Windows のインストール</h2>
<p>基本的にインストーラを起動してそのまま進めるだけで OK。インストール後は、WSL の CLI から触れるように、<samp>Settings</samp> &gt; <samp>General</samp> にある <samp>Expose daemon on tcp://localhost:2375 without TLS</samp> にチェックを付けておく。</p>
<p>また、Windows コンテナを使用すると、ホストの起動時に MobyLinuxVM の起動で待たされたり、何もしてないときでも MobyLinuxVM にメモリが食われることがなくなるというメリットがあるので、自分は Windows コンテナで動かしている。Linux コンテナとの違いは理解していないが、今のところ困ってはいない。Windows コンテナで動かすには、インストール途中の <samp>Use Windows containers instead of Linux containers</samp> にチェックを付けておくか、後から変更したい場合はタスクトレイの Docker アイコンを右クリックし、<samp>Switch to Windows containers&hellip;</samp> (戻すときは <samp>Switch to Linux containers&hellip;</samp>) を選ぶ。</p>
<p>ただし、そのままだと <samp>docker: Error response from daemon: operating system on which parent image was created is not Windows.</samp> というエラーで Linux のイメージを動かせないので、<samp>Settings</samp> &gt; <samp>Daemon</samp> から <samp>Experimental</samp> を有効にする必要がある。</p>
<h2 id="docker-cli-のインストール">Docker CLI のインストール</h2>
<p><a href="https://docs.docker.com/install/linux/docker-ce/ubuntu/">公式ドキュメント</a>通りでもいいけど、どうせ CLI しか使わないので、docker-ce ではなく docker-ce-cli を指定した。</p>
<p>あとは WSL 側の環境変数に <code>DOCKER_HOST=tcp://0.0.0.0:2375</code> を設定してやると、WSL の Docker CLI からホスト Docker を操作できる。</p>
<h2 id="参考">参考</h2>
<ul>
<li><a href="https://laboradian.com/use-docker-on-wsl/">WSL の docker client から、Docker for Windows の docker daemon を使う手順 | ラボラジアン</a></li>
<li><a href="https://yamanxworld.blogspot.com/2018/04/windows-10-17091803-linux.html">山市良のえぬなんとかわーるど: Windows 10 バージョン1709/1803 と Linux コンテナー (LCOW)</a></li>
</ul>
<h2 id="その他">その他</h2>
<p>2 年積ん読している間に 2 版が出てしまった…… 2 年経つとさすがに 1 版の内容は所々古くなってしまっている。</p>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B07BHK5KX7?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B07BHK5KX7.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B07BHK5KX7?tag=mfjt-22">プログラマのためのDocker教科書 第2版 インフラの基礎知識&amp;コードによる環境構築の自動化</a></div>
  </div>
]]></content:encoded>
    </item>
    <item>
      <title>2018 年買ってよかったもの</title>
      <link>https://mfjt.jp/diary/2018/12/31/000000/</link>
      <pubDate>Mon, 31 Dec 2018 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2018/12/31/000000/</guid>
      <description>&lt;h2 id=&#34;hahahugoshortcode5s0hbhb&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B071Z2TFHX?tag=mfjt-22&#34;&gt;Logicool MX Master 2S&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;仕事場であてがわれていたエレコムの有線マウスを 2 年くらい我慢しながら使っていたが、いい加減嫌になったので持ち込んだ。元々使っていた&lt;a href=&#34;https://www.amazon.co.jp/dp/B001LK9E7S?tag=mfjt-22&#34;&gt;旧金型のリアフォ&lt;/a&gt;との何の面白みもない組み合わせだが、それくらいでちょうどいい。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="hahahugoshortcode5s0hbhb"><a href="https://www.amazon.co.jp/dp/B071Z2TFHX?tag=mfjt-22">Logicool MX Master 2S</a></h2>
<p>仕事場であてがわれていたエレコムの有線マウスを 2 年くらい我慢しながら使っていたが、いい加減嫌になったので持ち込んだ。元々使っていた<a href="https://www.amazon.co.jp/dp/B001LK9E7S?tag=mfjt-22">旧金型のリアフォ</a>との何の面白みもない組み合わせだが、それくらいでちょうどいい。</p>
<h2 id="adguard-for-android"><a href="https://adguard.com/">AdGuard for Android</a></h2>
<p>広告ブロックの善し悪しについては色々言われるが、スマホ向けサイトの広告のウザさは目に余るものがあるのでやむなしという感じ。無料版でも特に不満はなかったが、夏のセールで Lifetime license が ¥ 500 くらいだったので買った。QOL の上がり具合だと、こいつが一番かもしれない。</p>
<h2 id="hahahugoshortcode5s2hbhb"><a href="https://www.amazon.co.jp/dp/B07KZHL94N?tag=mfjt-22">DIME 2019 年 2 月号</a></h2>
<p><a href="https://hb.afl.rakuten.co.jp/hsc/1799ab1d.80741089.168e3f30.205148bf/?link_type=text&amp;ut=eyJwYWdlIjoic2hvcCIsInR5cGUiOiJ0ZXh0IiwiY29sIjowLCJjYXQiOiIxIiwiYmFuIjoiMTUyOTk1MSJ9">楽天マガジン</a>を契約しているから基本的に紙の雑誌を買うことはないけど、はい、付録のイヤーチップ目当てです。イヤホンは WALKMAN 付属のノイキャン付きのやつを使っていて、イヤーチップも純正品に交換しながら使っていたが、長時間付けてると蒸れてきたり耳が痛くなるのが不満だった。付録のイヤーチップでそのあたりの不満は解消されたので、とりあえず予備を含めて 3 部買っておいた。</p>
<p>イヤホンをワイヤレス化したいとは思っていて、<a href="https://www.amazon.co.jp/dp/B07BXMBYYQ?tag=mfjt-22">WI-SP600N</a> を狙っていたけど、評価が芳しくなくて結局買わずじまいだった。</p>
]]></content:encoded>
    </item>
    <item>
      <title>tDiary を Heroku に移した</title>
      <link>https://mfjt.jp/diary/2018/12/30/000000/</link>
      <pubDate>Sun, 30 Dec 2018 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2018/12/30/000000/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://mfjt.jp/diary/2016/01/05/000000/&#34;&gt;Passenger で謎に動かないやつ&lt;/a&gt;、tdiary.conf の &lt;var&gt;base_uri&lt;/var&gt; が未設定だと問題なく、設定後に Apache や Nginx を再起動すると再現することは分かったけど、どうにもならないので諦めて Heroku に引っ越すことにした。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/diary/2016/01/05/000000/">Passenger で謎に動かないやつ</a>、tdiary.conf の <var>base_uri</var> が未設定だと問題なく、設定後に Apache や Nginx を再起動すると再現することは分かったけど、どうにもならないので諦めて Heroku に引っ越すことにした。</p>
<p>初めて Heroku を使ったけど、<a href="https://github.com/tdiary/tdiary-core/blob/master/doc/INSTALL-paas.md#%E5%8B%95%E3%81%8B%E3%81%97%E6%96%B9---heroku-%E3%81%AE%E5%A0%B4%E5%90%88">公式のドキュメント</a>を見ながらやればほぼほぼ迷うことはなかった。PaaS ならではの話ではないが、update.rb にアクセスすると <samp>OAuth::Unauthorized 403 Forbidden</samp> でコケるという問題があったが、Twitter の仕様変更があったらしく、Callback URL を <code>/update.rb/auth/twitter/callback</code> の形式にすることで解決した。その他、Heroku Scheduler で Sleep を回避させたり、タイムゾーンを変更したくらいで特に問題もなく動いている。</p>
<p>あとは、Heroku上のtDiaryを運用するのやり方で設定画面からの tDiary 更新を楽しみに肉の日を迎えたが、<samp>no commits in upstream</samp> と言われて一向に更新できないので<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>、GitHubでFork/cloneしたリポジトリを本家リポジトリに追従するを参考に手動で更新することにした。とは言え、ちょちょいとやれば勝手にデプロイされるし十分楽なんだけどね。</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>試しに Personal access tokens を適当な値に変えてみると認証が通らなくなるから、全くもって駄目というわけでもなさそう&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>翔泳社が半額セールやってるからいくつか買った</title>
      <link>https://mfjt.jp/diary/2016/02/20/000000/</link>
      <pubDate>Sat, 20 Feb 2016 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2016/02/20/000000/</guid>
      <description>&lt;p&gt;もうちょっとインプットを増やさないと。&lt;/p&gt;
&lt;div class=&#34;asin-detail&#34;&gt;
    &lt;a href=&#34;https://www.amazon.co.jp/dp/B00NBHLZJO?tag=mfjt-22&#34; class=&#34;asin-detail-img&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/P/B00NBHLZJO.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/a&gt;
    &lt;div class=&#34;asin-detail-info&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B00NBHLZJO?tag=mfjt-22&#34;&gt;20代でマスターしたい仕事のルール「考え方・伝え方」のきほん&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;div class=&#34;asin-detail&#34;&gt;
    &lt;a href=&#34;https://www.amazon.co.jp/dp/B00HQ7S5B6?tag=mfjt-22&#34; class=&#34;asin-detail-img&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/P/B00HQ7S5B6.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/a&gt;
    &lt;div class=&#34;asin-detail-info&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B00HQ7S5B6?tag=mfjt-22&#34;&gt;年収300万円の残念な働き方　1万人に会って分かった年収の壁を打ち破る方法&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;div class=&#34;asin-detail&#34;&gt;
    &lt;a href=&#34;https://www.amazon.co.jp/dp/B00UIWBD0Q?tag=mfjt-22&#34; class=&#34;asin-detail-img&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/P/B00UIWBD0Q.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/a&gt;
    &lt;div class=&#34;asin-detail-info&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B00UIWBD0Q?tag=mfjt-22&#34;&gt;できる人はなぜ、そこまで「姿勢」にこだわるのか？ 毎日5分の背骨の体操でここまで変わる！&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;div class=&#34;asin-detail&#34;&gt;
    &lt;a href=&#34;https://www.amazon.co.jp/dp/B017UGA7NG?tag=mfjt-22&#34; class=&#34;asin-detail-img&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/P/B017UGA7NG.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/a&gt;
    &lt;div class=&#34;asin-detail-info&#34;&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B017UGA7NG?tag=mfjt-22&#34;&gt;プログラマのためのDocker教科書 インフラの基礎知識＆コードによる環境構築の自動化&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>もうちょっとインプットを増やさないと。</p>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B00NBHLZJO?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B00NBHLZJO.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B00NBHLZJO?tag=mfjt-22">20代でマスターしたい仕事のルール「考え方・伝え方」のきほん</a></div>
  </div>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B00HQ7S5B6?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B00HQ7S5B6.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B00HQ7S5B6?tag=mfjt-22">年収300万円の残念な働き方　1万人に会って分かった年収の壁を打ち破る方法</a></div>
  </div>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B00UIWBD0Q?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B00UIWBD0Q.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B00UIWBD0Q?tag=mfjt-22">できる人はなぜ、そこまで「姿勢」にこだわるのか？ 毎日5分の背骨の体操でここまで変わる！</a></div>
  </div>
<div class="asin-detail">
    <a href="https://www.amazon.co.jp/dp/B017UGA7NG?tag=mfjt-22" class="asin-detail-img"><img src="https://m.media-amazon.com/images/P/B017UGA7NG.jpg" alt="" loading="lazy"></a>
    <div class="asin-detail-info"><a href="https://www.amazon.co.jp/dp/B017UGA7NG?tag=mfjt-22">プログラマのためのDocker教科書 インフラの基礎知識＆コードによる環境構築の自動化</a></div>
  </div>
]]></content:encoded>
    </item>
    <item>
      <title>tDiary インストールで躓いたところ</title>
      <link>https://mfjt.jp/diary/2016/01/05/000000/</link>
      <pubDate>Tue, 05 Jan 2016 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2016/01/05/000000/</guid>
      <description>&lt;h2 id=&#34;gem-でインストールした-tdiary-が起動しない&#34;&gt;gem でインストールした tDiary が起動しない&lt;/h2&gt;
&lt;p&gt;かつては CGI で動かしてたけど、今はどうやらそんな時代でもなさそうだったので、gem でインストールして mod_passenger で動かそうとしてだいぶ苦労した。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="gem-でインストールした-tdiary-が起動しない">gem でインストールした tDiary が起動しない</h2>
<p>かつては CGI で動かしてたけど、今はどうやらそんな時代でもなさそうだったので、gem でインストールして mod_passenger で動かそうとしてだいぶ苦労した。</p>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">gemでtDiary入れてbundle exec tdiary serverしたら、&quot;tdiary.rb:24:in `require&#39;: cannot load such file -- json (LoadError)&quot; って出てきてRuby力なさすぎて詰んでる</p>&mdash; oɹıɥɐsɐɯ ɐʇıɾnɟ (@mfjt) <a href="https://twitter.com/mfjt/status/648906978513698817?ref_src=twsrc%5Etfw">September 29, 2015</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<p>Twitter でぼやいてたら @machu さんに<a href="https://twitter.com/machu/status/649023345770434561">拾ってもらったので</a> <a href="https://github.com/tdiary/tdiary-core/issues/510">issue 上げた</a>。</p>
<p>結果よう分からんことには変わりないが、提示してもらったワークアラウンドで無事動くようになった。</p>
<h2 id="tdiary-421-でapache-を再起動させると日記が-404-になる">tDiary 4.2.1 で、Apache を再起動させると日記が 404 になる</h2>
<p>インストール直後は問題なく見えているけど、Apache を再起動させると日記が見えなくなってしまうという事象。1 回の再起動で見えなくなることもあれば、何回か再起動させて起こることもある。</p>
<p>tDiary と mod_passenger のどちらに被疑があるのか皆目見当がつかなかったが、インストール直後は問題ないことや、<a href="https://github.com/tdiary/tdiary-core/pull/533">PR #533</a> の内容から、tdiary.conf を削除して Apache を上げ直すと直ることまでは分かった。</p>
<p>こっちの問題は、PR #533 が原因なのであれば 4.2.2 で直るだろうから、今は 4.2.0 に逃げることにした。</p>
]]></content:encoded>
    </item>
    <item>
      <title>tDiary 再開</title>
      <link>https://mfjt.jp/diary/2016/01/01/000000/</link>
      <pubDate>Fri, 01 Jan 2016 00:00:00 +0900</pubDate>
      <guid>https://mfjt.jp/diary/2016/01/01/000000/</guid>
      <description>&lt;p&gt;やり直し。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>やり直し。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
