<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AWS on ゲンゾウ用ポストイット</title><link>https://genzouw.com/entry/category/aws/</link><description>Recent content in AWS on ゲンゾウ用ポストイット</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Thu, 17 Aug 2023 08:33:47 +0900</lastBuildDate><atom:link href="https://genzouw.com/entry/category/aws/index.xml" rel="self" type="application/rss+xml"/><item><title>OIDCを使ってGithub ActionsからAWSにアクセスする仕組みについて理解を整理してみた</title><link>https://genzouw.com/entry/2023/08/16/174745/3549/</link><pubDate>Wed, 16 Aug 2023 17:47:45 +0900</pubDate><guid>https://genzouw.com/entry/2023/08/16/174745/3549/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Github Actions から AWS クラウドリソースを操作するために&lt;code&gt;ACCESS_KEY&lt;/code&gt;、&lt;code&gt;SECRET_ACCESS_KEY&lt;/code&gt;を使う方法はもう古い、OIDCを使うのが一般的といわれましたが理解していなかったため整理しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;今回取り上げる &lt;strong&gt;CI/CD ( ビルド ) パイプライン&lt;/strong&gt; は &lt;strong&gt;Github Actions&lt;/strong&gt; に限定しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;クラウドプロバイダー&lt;/strong&gt; に関しても、 &lt;strong&gt;AWS&lt;/strong&gt; に限定しています。&lt;/p&gt;&#10;&lt;p&gt;ただしアーキテクチャはCI/CDパイプラインがCircleCIやCloudBuild、クラウドプロバイダーがGCPやAzureに置き換えられたとしても適用可能なものと考えられます。&lt;/p&gt;&#10;&lt;h2 id="パスワードやアクセストークンを使ってgithub-actionsからクラウドへ認証する方法の問題点"&gt;パスワードやアクセストークンを使ってGithub Actionsからクラウドへ認証する方法の問題点&lt;/h2&gt;&#10;&lt;p&gt;Github ActionsのようなCI/CDパイプラインから、クラウド環境 ( AWS、Azure、GCP&amp;hellip; ) にアクセスするケースは多いはずです。&lt;/p&gt;&#10;&lt;p&gt;ビルドされたソフトウェアやコンテナイメージはいずれデプロイされますし、デプロイ環境としてクラウド環境 ( ex: AWS ) が利用されることが多いからです。&lt;/p&gt;&#10;&lt;p&gt;Github Actionsがクラウド上のリソースにアクセスするために、事前にパスワードやアクセストークンといった認証情報を取得しておく必要があります。&lt;/p&gt;&#10;&lt;p&gt;これらの認証情報はGithubの &lt;strong&gt;secrets&lt;/strong&gt; に保存することが多いでしょう。&#10;Github Actionsワークフローは実行のたびに &lt;strong&gt;secrets&lt;/strong&gt; から認証情報を取り出し、これを使ってクラウド環境へのアクセスを可能にします。&lt;/p&gt;&#10;&lt;p&gt;しかし、このような &lt;strong&gt;secrets&lt;/strong&gt; を使う方法には問題があります。&#10;以下のような手間が発生します。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;クラウド上のIAMサービスで認証情報を生成する&lt;/li&gt;&#10;&lt;li&gt;生成した認証情報をGithubのsecretsに登録する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;つまり、認証情報が二重管理されることになります&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;h2 id="oidc--openid-connect--を使うメリット"&gt;OIDC ( OpenID Connect ) を使うメリット&lt;/h2&gt;&#10;&lt;p&gt;そこで登場するのがOIDC ( OpenID Connect ) です。&lt;/p&gt;&#10;&lt;p&gt;OIDCを使うと、Github Actionsワークフローがクラウドプロバイダーに対して要求するアクセストークンは、有効期限の短いものとなります。&lt;/p&gt;&#10;&lt;p&gt;もちろんOIDC認証による認証をサポートされているクラウドプロバイダーでしか利用できない方式ではありますが、現在はほとんどのクラウドプロバイダー ( AWS、Azune、GCP、HashiCorp Vault&amp;hellip; ) がOIDCをサポートしています。&lt;/p&gt;</description></item><item><title>AWS CodeWhispererを使うためにセットアップを進めたがVimから利用できないことがわかり諦める</title><link>https://genzouw.com/entry/2023/04/16/072320/3477/</link><pubDate>Sun, 16 Apr 2023 07:23:20 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/16/072320/3477/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;きっかけは以下の記事を見たことです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[AWS 版 GitHub Copilot となる「Amazon CodeWhisperer」が正式版に。&#10;個人ユーザーは無料、VSCode に対応 － Publickey] ( &lt;a href="https://www.publickey1.jp/blog/23/awsgithub_copilotamazon_codewhisperervscode.html"&gt;https://www.publickey1.jp/blog/23/awsgithub_copilotamazon_codewhisperervscode.html&lt;/a&gt; )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;正式版となった上に、個人ユーザーは無料。&#10;OpenAI 様にはそこそこのお金を払っているわけですが、無料のものが利用できるとなれば乗っかりたいところです。&#10;またビジネス版でも $19 とまあまあ許容範囲かと思いました。&#10;Github Copilot との違いも把握しておきたいです。&lt;/p&gt;&#10;&lt;p&gt;となれば早速使ってみなければ。&lt;/p&gt;&#10;&lt;h2 id="作業の流れ--作業ログ-"&gt;作業の流れ ( 作業ログ )&lt;/h2&gt;&#10;&lt;p&gt;いつものように AWS Console にログインし、上部の検索エリアから検索してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;whisper&lt;/strong&gt; と入力しようとしたらすでに候補が上がってきました。&#10;見つかったページをクリックしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=15EztqI9_DRQcmpumJNxXgf8AYQ6qrw-v" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;メニューをクリックすると以下のようなページが表示されました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1nKfubSRazSX8j7ppPp5f6t5in-UIjLdP" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Get started&lt;/strong&gt; をクリック。&lt;/p&gt;&#10;&lt;p&gt;残念。&#10;利用のためには事前準備が必要とのこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1lAIap2CRKM97sqXzHKBEOR9tACsCvG-u" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IAM Identity Center&lt;/strong&gt; が有効になっていないので、事前に有効にしなければなりません。&lt;/p&gt;&#10;&lt;h3 id="iam-identity-center-有効化"&gt;IAM Identity Center 有効化&lt;/h3&gt;&#10;&lt;p&gt;以下のページを参考に、 &lt;strong&gt;IAM Identity Center&lt;/strong&gt; を有効にします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/getting-started.html"&gt;はじめに - AWS IAM Identity Center ( successor to AWS Single Sign-On )&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Active Directory のような LDAP データベースとつないで ID 管理を容易にするサービスのようです。&#10;自分個人で利用するので当然そんな DB は持ち合わせていませんが、必要だということなので有効化しておきましょう。&lt;/p&gt;</description></item><item><title>MySQLのMAX_EXECUTION_TIMEを使って長時間実行中のクエリを強制的に中断させる</title><link>https://genzouw.com/entry/2023/02/04/090007/3201/</link><pubDate>Sat, 04 Feb 2023 09:00:07 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/04/090007/3201/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;多くのサービスでは、MySQL データベースを利用しています。&lt;/p&gt;&#10;&lt;p&gt;まれに実行時間の長いクエリが発生します。&#10;いくつか上がった対策の 1 つに実行時間の長い SELECT クエリを強制的に終了させるという案がありました。&#10;案を実現するために &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; の設定を利用できます。&lt;/p&gt;&#10;&lt;p&gt;ここで挙がった &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; とはどのような設定であり、どのように変更するのがよいかを紹介します。&lt;/p&gt;&#10;&lt;h2 id="mysql-の-max_execution_time-とはなにか"&gt;MySQL の &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; とはなにか？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; とはどんな設定項目なのでしょうか。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_execution_time"&gt;MySQL 5.7 の公式ドキュメント&lt;/a&gt; には以下のように書かれています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;MySQL 5.7 から利用できる設定項目である&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;読み取り専用の SELECT 文にだけ適用される&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;読み取り専用じゃない SELECT 文とは、更新を行うファンクションを呼び出している SELECT 文のこと ( ex: &lt;code&gt;select my_stored_func_to update&lt;/code&gt; )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ファンクションの中の SELECT 文には適用されない&lt;/li&gt;&#10;&lt;li&gt;デフォルト値は &lt;strong&gt;0&lt;/strong&gt; であり、この状態では実行タイムアウトは無効 ( 結果が取得できるまで実行される )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;検証は Docker Compose を使って行います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.21, build baeda1f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;利用する MySQL の Docker イメージは &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; の設定が利用できる MySQL 5.7 を使用します。&lt;/p&gt;</description></item><item><title>AWSの設定(プロファイル)をコマンドで簡単に切り替える方法</title><link>https://genzouw.com/entry/2021/09/03/212610/2769/</link><pubDate>Fri, 03 Sep 2021 21:26:10 +0900</pubDate><guid>https://genzouw.com/entry/2021/09/03/212610/2769/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;管理するクラウド上のシステムが増えてくると、AWS の設定(プロファイル)の切り替えが頻発してきます。&lt;/p&gt;&#10;&lt;p&gt;aws では、設定情報+認証情報をそれぞれ以下のファイルで管理しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;`~/.aws/config&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;~/.aws/credentials&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;僕の Mac の設定ファイルはそれぞれ以下のようになっています。 ( &lt;em&gt;セキュアな情報のため、一部マスキング OR 変換しています。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat ~/.aws/config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;default&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-southeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;profile project-production&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-northeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;profile project-staging&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-northeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;profile project-development&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-northeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat ~/.aws/credentials&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;default&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;project-production&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;project-staging&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;project-development&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;僕の Mac には AWS 接続用のプロファイルが &lt;strong&gt;4 つ&lt;/strong&gt; 存在していることになります。&lt;/p&gt;</description></item><item><title>「Amazon Cognito」で提供するログインページを自作してみる（`aws-cli`で構築）</title><link>https://genzouw.com/entry/2019/06/06/234117/1594/</link><pubDate>Thu, 06 Jun 2019 23:41:17 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/06/234117/1594/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「Amazon Cognito」を使って既存のWebサービスのログイン認証機能を一部置き直す方法について、何パターンか検討してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/21/085627"&gt;「Amazon Cognito」を使ってログイン機能を作成する（SNS認証あり） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/05/22/163232"&gt;既存のWebアプリで「Amazon Cognito」認証を利用する（その１:処理フローの整理） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/05/24/012926"&gt;既存のWebアプリで「Amazon Cognito」認証を利用する（その２:PHPのサンプルプログラムの実装） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今まで検討してみた方法ですが、いずれも「Amazon Cognito」が提供するログインページをそのまま利用する、というものでした。&lt;/p&gt;&#10;&lt;p&gt;どうしてもログインページを既存のWebシステムのデザインに合わせたい、という場合にはログインページも既存のWebページのものを使う方法もあります。&#10;既存のWebページのものを流用する方法についてまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;今回はなるべくAWSの「マネージメントコンソール」からの操作を行わずに「Cognito」を使ったログイン機能を実装してみます。&lt;/p&gt;&#10;&lt;p&gt;そのため、以下のコマンドを利用することを前提としています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://github.com/aws/aws-cli"&gt;aws&lt;/a&gt; コマンド&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; コマンド&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; コマンド&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.170 Python/3.7.3 Darwin/18.6.0 botocore/1.12.160&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ jq --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq-1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6.9.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="作業開始"&gt;作業開始&lt;/h2&gt;&#10;&lt;p&gt;今回作成したプログラムは以下のGithubリポジトリにコミット済みです。&#10;試行錯誤した結果作成されたプログラムを負いながら手順を説明します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/genzouw/aws-cognito-example-custom-page"&gt;GitHub - genzouw/aws-cognito-example-custom-page&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;圧縮されたソースファイルをダウンロードするか、 &lt;code&gt;git&lt;/code&gt; コマンドで &lt;code&gt;clone&lt;/code&gt; しておいてください。&#10;（Githubリポジトリページのソースコードを見ても良いです。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone git@github.com:genzouw/aws-cognito-example-custom-page.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※(2019-06-06) 便宜上、当エントリにGithubリポジトリ上のコードと同じ内容を貼り付けておきますが、メンテナンスはGithubリポジトリの方だけとする予定です。乖離する可能性があることをご了承ください。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>既存のWebアプリで「Amazon Cognito」認証を利用する（その２:PHPのサンプルプログラムの実装）</title><link>https://genzouw.com/entry/2019/05/24/012926/1532/</link><pubDate>Fri, 24 May 2019 01:29:26 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/24/012926/1532/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/05/22/163232"&gt;既存の Web アプリで「Amazon Cognito」認証を利用する（その１:処理フローの整理） | ゲンゾウ用ポストイット&lt;/a&gt; で「Cognito」の認証の流れを整理しました。&lt;/p&gt;&#10;&lt;p&gt;ここからは、PHP のサンプルプログラムを実装してより具体的に理解を深めていきたいと思います。&lt;/p&gt;&#10;&lt;p&gt;早速進めて行こうと思います。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、 PHPのサンプルプログラムはGithubで公開しているので、参考にしていただければと思います。&lt;/p&gt;&#10;&lt;p&gt;( &lt;em&gt;実行するだけであれば、 &lt;strong&gt;「Docker Compose」&lt;/strong&gt; がインストールされていれば動きます。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/genzouw/aws-cognito-example"&gt;GitHub - genzouw/aws-cognito-example&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="aws-cognito-の作成設定"&gt;AWS Cognito の作成、設定&lt;/h2&gt;&#10;&lt;p&gt;まずは &lt;strong&gt;AWS&lt;/strong&gt; 側の設定を行っていきたいと思います。&lt;/p&gt;&#10;&lt;h3 id="1-cognitoのユーザープールの作成"&gt;1. 「Cognito」のユーザープールの作成&lt;/h3&gt;&#10;&lt;p&gt;初めて &lt;strong&gt;Cognito&lt;/strong&gt; にアクセスした場合、以下のようなページが表示されるはずです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1Uk0iZi5oqj7BNogwtBN256DWOitzcFDr" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ユーザープールの管理&lt;/strong&gt; を選択して先に進みます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1G1Yp-Yf2Bxb8HT5mI6Le-p5uUFqoTWBN" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ユーザープールを作成する&lt;/strong&gt; をクリックします。&lt;/p&gt;&#10;&lt;p&gt;作成するユーザープール名を入力し、次に進みます。&lt;/p&gt;&#10;&lt;p&gt;ここでは &lt;code&gt;g-user-pool&lt;/code&gt; というユーザープール名にしました。&lt;/p&gt;&#10;&lt;p&gt;後は次へ次へと進むだけです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=17sDPr_g6SebBCKuNoDTMimLNMx6wNTQR" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="2cognitoに新しいアプリクライアントの登録"&gt;2.「Cognito」に新しい「アプリクライアント」の登録&lt;/h3&gt;&#10;&lt;p&gt;「Cognito」のユーザープール設定ページから &lt;strong&gt;アプリクライアントの追加&lt;/strong&gt; をクリックします。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=157Kc7VEShH-rmvQdFKYF04knfY9mi-Y8" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;以下のように設定します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;アプリクライアント名 : &lt;code&gt;aws-cognito-example&lt;/code&gt; ( ※こちらは好きな名前をつけましょう )&lt;/li&gt;&#10;&lt;li&gt;トークンの有効期限を更新 (日) : &lt;code&gt;1&lt;/code&gt; ( 特にこだわりは有りませんでした。デフォルトの30日のままでも構いません。 )&lt;/li&gt;&#10;&lt;li&gt;クライアントシークレットを生成 : &lt;code&gt;チェックを外す&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1Kd0EKVhO9VjjSVb0fwuLkrkC7etM3On9" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="3アプリクライアントの設定"&gt;3.「アプリクライアントの設定」&lt;/h3&gt;&#10;&lt;p&gt;今度は左のタブから「アプリクライアントの設定」を開きます。&#10;以下のように設定します。&lt;/p&gt;</description></item><item><title>既存のWebアプリで「Amazon Cognito」認証を利用する（その１:処理フローの整理）</title><link>https://genzouw.com/entry/2019/05/22/163232/1515/</link><pubDate>Wed, 22 May 2019 16:32:32 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/22/163232/1515/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以前、 &lt;a href="https://genzouw.com/entry/2019/04/21/085627"&gt;「Amazon Cognito」を使ってログイン機能を作成する（SNS 認証あり） | ゲンゾウ用ポストイット&lt;/a&gt; で「Amazon Cognito」のユーザ認証機能を利用してログインページを構築しました。&lt;/p&gt;&#10;&lt;p&gt;しかし、やりたかったことは既存の Web アプリケーションのログイン機能を「Cognito」を利用した仕組みに置き直すということだったため、完全ではありませんでした。&lt;/p&gt;&#10;&lt;p&gt;「Cognito」のユーザ認証が完了した後、既存のアプリケーションでそれを引き継ぐための仕組みを構築すべく、追加で調査をしました。&#10;（今回は整理にとどめて次回のエントリでサンプルコードの実装・公開をしたいと思います。）&lt;/p&gt;&#10;&lt;h2 id="改めて-oauth2-または-openid-connect-の処理フローについて"&gt;改めて OAuth2 または OpenID Connect の処理フローについて&lt;/h2&gt;&#10;&lt;p&gt;「Congito」を使ったユーザ認証は「OpenID Connect」という方式になります。「OAuth2」方式をベースとした後発の認証方式です。したがって「OAuth2」の理解を深めることが「OpenID Connect」の理解を深めることにつながると思いました。&lt;/p&gt;&#10;&lt;p&gt;僕が説明するより以下の記事を読むほうが圧倒的にわかりやすいです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be"&gt;一番分かりやすい OAuth の説明 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe"&gt;一番分かりやすい OpenID Connect の説明 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;とはいえ、自分の頭の中を整理するため、自分なりにまとめてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;めっちゃ汚い&lt;/strong&gt;ですが、手書きの処理フローになります。（一部字が潰れたり上塗りされていたりしていますが（汗））&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1k54a3o3cKfS9xG2xCHDKZHO-NZZRPBoM" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="処理フローを箇条書きで文字起こし"&gt;処理フローを箇条書きで文字起こし&lt;/h3&gt;&#10;&lt;p&gt;登場人物は 3 つ、 &amp;ldquo;Browser&amp;rdquo; / &amp;ldquo;AppServer&amp;rdquo; / &lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; です。（&amp;ldquo;Browser&amp;quot;は人の形で表現しています。）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&amp;ldquo;Browser&amp;rdquo; は &amp;ldquo;AppServer&amp;rdquo; にアクセス&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;AppServer&amp;rdquo; はログイン済みかを判定します。未ログイン状態の場合には &lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; に &amp;ldquo;redirect&amp;rdquo;（&amp;ldquo;redirect&amp;quot;の URL に対して事前に「Cognito」から払い出された「アプリケーション ID」などを付与）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; は &amp;ldquo;login page&amp;rdquo; を返却&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;Browser&amp;rdquo; は &amp;ldquo;login&amp;rdquo; を行う&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; は受け取った認証情報が正しければ &amp;ldquo;redirect&amp;rdquo; 。 &amp;ldquo;redirect&amp;rdquo; の URL の後方にはクエリ文字列形式で &lt;strong&gt;Authentication code&lt;/strong&gt; と呼ばれるものを付与 （ex: &lt;code&gt;https://hoge.com/callback.html&amp;amp;code=xxxx&lt;/code&gt; ）&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;AppServer&amp;rdquo; は受け取った &lt;strong&gt;Authentication code&lt;/strong&gt; を使って &lt;strong&gt;Cognito&lt;/strong&gt; にリクエスト&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ID Token&lt;/strong&gt; を取得&lt;/li&gt;&#10;&lt;li&gt;JavaScript では、ページの URL からフラグメントを切り出し、(5)で受け取った &lt;strong&gt;ID Token&lt;/strong&gt; を抜き出すロジックが書かれている。&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;AppServer&amp;rdquo; は HTML/JavaScript/ &lt;strong&gt;ID Token&lt;/strong&gt; を返却。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;取得できた &lt;strong&gt;「ID Token」&lt;/strong&gt; ですが、「SPA」の場合は &amp;ldquo;Broser&amp;rdquo; の &lt;strong&gt;「LocalStorage」&lt;/strong&gt; 機能を使って保存しておき、以降の通信時に「HTTP Header」に付与して &amp;ldquo;AppServer&amp;rdquo; と通信を行うことで認証済みであることを証明します。&lt;/p&gt;</description></item><item><title>AWS-CLIを実行したら `CERTIFICATE_VERIFY_FAILED` というエラーメッセージが表示されてハマってしまった</title><link>https://genzouw.com/entry/2019/05/07/085327/1437/</link><pubDate>Tue, 07 May 2019 08:53:27 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/07/085327/1437/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;GWの10連休に入る直前に実行したところ、突然エラーメッセージが表示され正常に動作しなくなってしまいました。&lt;/p&gt;&#10;&lt;h2 id="どのようなエラーメッセージが表示された"&gt;どのようなエラーメッセージが表示された？&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SSL validation failed &lt;span class="k"&gt;for&lt;/span&gt; https://ec2.ap-southeast-1.amazonaws.com/ &lt;span class="o"&gt;[&lt;/span&gt;SSL: CERTIFICATE_VERIFY_FAILED&lt;span class="o"&gt;]&lt;/span&gt; certificate verify failed&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="実行環境"&gt;実行環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.140 Python/3.7.3 Darwin/18.5.0 botocore/1.12.130&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="どのように-aws-cl-を利用していたか"&gt;どのように &lt;code&gt;aws-cl&lt;/code&gt; を利用していたか？&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;EC2&lt;/strong&gt; 環境を構築するための簡易なシェルスクリプトを作成し、その中で何度か &lt;code&gt;aws&lt;/code&gt; コマンドを実行していました。&lt;/li&gt;&#10;&lt;li&gt;シェルスクリプトは &lt;code&gt;Bash&lt;/code&gt; で動作するようにシバンを設定していました。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;#!/usr/bin/env bash&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="試してみたこと"&gt;試してみたこと&lt;/h2&gt;&#10;&lt;h3 id="aws-コマンドのバージョンアップ"&gt;&lt;code&gt;aws&lt;/code&gt; コマンドのバージョンアップ&lt;/h3&gt;&#10;&lt;p&gt;はじめは &lt;code&gt;aws-cli&lt;/code&gt; のバージョンアップが原因かと思い、バージョンアップしてみたが、問題は解決しませんでした。&lt;/p&gt;&#10;&lt;h3 id="aws-コマンドのオプション追加"&gt;&lt;code&gt;aws&lt;/code&gt; コマンドのオプション追加&lt;/h3&gt;&#10;&lt;p&gt;以下のエントリを見つけました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://hatunina.hatenablog.com/entry/2018/09/10/221223"&gt;aws-cliでCERTIFICATE_VERIFY_FAILEDが出た時の対処 - hatunina’s blog&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;aws&lt;/code&gt; コマンドに &lt;code&gt;--no-verify&lt;/code&gt; というオプションを付与すればエラーを無視できるということですが、、以下の理由により他の方法で対処することにしました。&lt;/p&gt;</description></item><item><title>Amazon DynamoDBのプライマリーキーの２つのタイプについて理解できたことをまとめました</title><link>https://genzouw.com/entry/2019/04/28/103524/1416/</link><pubDate>Sun, 28 Apr 2019 10:35:24 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/28/103524/1416/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/231011"&gt;Amazon DynamoDBの構成要素について理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt; で「テーブル」、「項目」、「属性」、「プライマリーキー」について整理しましたが、今回は「プライマリーキー」についてもう少しわかったことをまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="プライマリーキーのタイプとデータの保存方法"&gt;プライマリーキーのタイプとデータの保存方法&lt;/h2&gt;&#10;&lt;p&gt;プライマリーキーを構成する「属性」の数が1つか複数かで用途や考えないといけないことが異なるようです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;単一「属性」で構成されるプライマリーキー : 「&lt;strong&gt;パーティションキー&lt;/strong&gt;」 タイプ&lt;/li&gt;&#10;&lt;li&gt;複数「属性」で構成されるプライマリーキー : 「&lt;strong&gt;パーティションキー+ソートキー&lt;/strong&gt;」 タイプ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;データの保存方法にも違いがあります。&#10;両者はどう違うのでしょう？&lt;/p&gt;&#10;&lt;h2 id="パーティションキータイプ"&gt;「パーティションキー」タイプ&lt;/h2&gt;&#10;&lt;p&gt;1つの属性で構成されたシンプルなプライマリーキーとなっています。&lt;/p&gt;&#10;&lt;p&gt;キーの値を「ハッシュ関数」という特殊な関数を使って変換します。&#10;変換後の値で、「項目」を配置するデータ格納場所がきまります。&#10;つまり「ハッシュ関数」とは、データ置き場を決めるための関数なのです。&lt;/p&gt;&#10;&lt;p&gt;「ハッシュ関数」を使ったデータ配置のメリットは、データの検索が高速であることです。&#10;データが一箇所に集まってしまうと検索が遅くなってしまいます。データが整理されないまま入れ物にごった煮にされている状態を想像してください。&#10;「ハッシュ関数」を使ってデータの配置場所を決められれば、データの検索が高速にできるわけです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-27-001.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;「ハッシュ関数」の結果はできる限りバラバラになるように考えられています。（このあたりはハッシュ関数の実装次第なのでおそらくそうなっているはずです。）&#10;もしバラバラにならなかったとすると、特定のデータ配置場所にだけデータが集まってしまい、やはり検索が遅くなってしまうからです。&lt;/p&gt;&#10;&lt;h2 id="パーティションキーソートキータイプ"&gt;「パーティションキー+ソートキー」タイプ&lt;/h2&gt;&#10;&lt;p&gt;2つの属性で構成されたプライマリーキーは、 属性のうち一つが&lt;strong&gt;パーティションキー&lt;/strong&gt;となり他方が&lt;strong&gt;ソートキー&lt;/strong&gt;となります。&#10;( 複合プライマリーキーと呼ばれたりもします。 )&lt;/p&gt;&#10;&lt;p&gt;パーティションキーのメリットはデータ配置場所が分散することでスキャンが高速になることでした。&#10;プライマリーキーが2つの属性で構成された場合、当然のことながら1つの属性でしか構成できないパーティションキーの値は重複する可能性があります。&lt;/p&gt;&#10;&lt;p&gt;これではハッシュ関数を利用したデータ分散のメリットが薄れてしまいます。&#10;ハッシュ関数で計算したデータ配置場所にデータが集まる傾向が高くなるためフルスキャンの問題と同様のことが発生します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-27-002.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;そこでソートキーです。&#10;データがバラバラに並んでいる場合にはフルスキャンを行わなければデータを見つけることができません。&#10;しかし、データがソートされていれば高速な探索アルゴリズムを使うことができます。&#10;( 僕は高速な探索アルゴリズムを知っているわけじゃないのですが二分探索の速さぐらいはイメージできます。 )&lt;/p&gt;&#10;&lt;p&gt;図鑑で探しものをする場合を例に上げましょう。&#10;分からない単語は一番後ろの索引を使って掲載ページを特定します。掲載ページが特定できたら、ページをペラペラ送りながら該当ページを探していきます。&#10;該当ページを用意に探す事が出来るのも ページ番号が小さい値から大きな値に正しく並んでくれてるからこそです。&lt;/p&gt;&#10;&lt;p&gt;パーティションキーは1つしか設定できず、他方はソートキーになることにはメリットもあります。&#10;ソートキーを構成する「属性」は範囲を指定して検索することができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ユーザのアクセス履歴情報(未ソート)に対して&lt;code&gt;12:00〜14:00&lt;/code&gt;のデータを検索する場合&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-28-003.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ユーザのアクセス履歴情報(ソート済)に対して&lt;code&gt;12:00〜14:00&lt;/code&gt;のデータを検索する場合&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-28-004.png" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="パーティションキーソートキータイプの注意点"&gt;「パーティションキー+ソートキー」タイプの注意点&lt;/h2&gt;&#10;&lt;p&gt;「パーティション+ソートキー」タイプを利用場合には、注意しないといけないケースがあります。&#10;&lt;strong&gt;ホットパーティション問題&lt;/strong&gt; と呼ばれる事象です。&lt;/p&gt;&#10;&lt;p&gt;パーティションキーの偏りにより発生する問題です。&lt;/p&gt;&#10;&lt;p&gt;以下の手書きのメモを例に取り上げます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-28-005.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;プライマリーキーは2つの属性から構成されているものとします。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;パーティションキー&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;ソートキー&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;ハッシュ関数で算出されたデータ配置場所&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;z&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;a&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;b&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;002&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;003&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;このとき、パーティションキー属性の値が &lt;code&gt;001&lt;/code&gt; であるデータが非常に多いため、&lt;code&gt;A&lt;/code&gt; のパーティションのみデータ量が増加することとなります。当然アクセス数もこのパーティションだけ多くなることでしょう。&lt;/p&gt;</description></item><item><title>Amazon DynamoDBの構成要素について理解できたことをまとめました</title><link>https://genzouw.com/entry/2019/04/27/231011/1411/</link><pubDate>Sat, 27 Apr 2019 23:10:11 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/27/231011/1411/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/001837"&gt;AWS-CLIを使ってDynamoDBを操作してみる&lt;/a&gt; で「AWS CLI」から「DynamoDB」を操作してみました。&lt;/p&gt;&#10;&lt;p&gt;ただし、しっかり「DynamoDB」の仕組みについて理解できていなかったので、改めてドキュメントを読み進めて理解できたことを整理したいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※誤りが多分にあるかと思いますので指摘を喜んでお待ちしております。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ちなみに、プライマリーキーについて更に整理した内容は以下のエントリにまとめています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/28/103524"&gt;Amazon DynamoDBのプライマリーキーの２つのタイプについて理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="参考資料"&gt;参考資料&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html"&gt;DynamoDB コアコンポーネント - Amazon DynamoDB&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="dynamodbの構成要素"&gt;DynamoDBの構成要素&lt;/h2&gt;&#10;&lt;p&gt;DynamoDBの構成要素は多くの点でリレーショナルデータベース（以下RDB）によく似ています。&#10;RDBを理解していれば理解しやすいと思います。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;概念&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;テーブル&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDBでいうテーブル。「項目」の集合。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;項目&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDBでいうレコード（行）。「属性」の集合。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;属性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDSでいうカラム（列）。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;プライマリーキー&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDSでいうプライマリーキー。1つあるいは2つの属性の組み合わせでテーブルの全「項目」で一意でなければならない。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1TRN33RU-a4K9clRU41uzZGPdlnjj5WB3" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;AWSのマニュアルでは、具体例として &lt;code&gt;People&lt;/code&gt; というテーブルとそのデータ構造について触れています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1qecZbi88gjm-cxw9BR0xnKTNoFThZ4SX" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;先に触れた構成要素と上記のサンプルデータの対応は以下のようになります。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;概念&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;テーブル&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;People&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;項目&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3項目。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;属性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PersonId, LastName, FirstName, Phone(1項目目のみ), Address(2項目目のみ), FavoriteColor(3項目目のみ)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;プライマリーキー&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PersonId だけで構成される単一プライマリーキー&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="プライマリーキーの属性の特徴制約"&gt;プライマリーキーの「属性」の特徴・制約&lt;/h2&gt;&#10;&lt;h3 id="プライマリーキーは1つ以上の属性で構成しなければならない"&gt;プライマリーキーは1つ以上の「属性」で構成しなければならない&lt;/h3&gt;&#10;&lt;p&gt;先に触れたとおり、プライマリーキーは単一の属性だけで構築しても良いですし、複数の属性で構成することもできます。&lt;/p&gt;&#10;&lt;p&gt;具体的な例を上げると、以下のようになります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;単一「属性」で構成されるプライマリーキー : 銀行テーブルに対する&lt;strong&gt;銀行コード&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;複数「属性」で構成されるプライマリーキー : 銀行支店テーブルに対する&lt;strong&gt;銀行コード+支店コード&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;「テーブル」にはプライマリーキーは必須となりますので、当然「テーブル」内の「項目」は最低でも1つの「属性」を持つことになります。&lt;/p&gt;&#10;&lt;h3 id="プライマリーキーは一意な値でなければならない"&gt;プライマリーキーは一意な値でなければならない&lt;/h3&gt;&#10;&lt;p&gt;DynamoDBのプライマリーキー属性値は重複を許しません。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;銀行テーブルには&lt;strong&gt;銀行コード&lt;/strong&gt;の重複はありえません&lt;/li&gt;&#10;&lt;li&gt;銀行支店テーブルには&lt;strong&gt;銀行コード+支店コード&lt;/strong&gt;の重複はありえません&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1yOafa096UFAn9s0lO_lYkjnGgzSd7qry" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="プライマリーキーはスカラー値でなければならない"&gt;プライマリーキーはスカラー値でなければならない&lt;/h3&gt;&#10;&lt;p&gt;プライマリーキーはスカラー値でなければいけません。&#10;以下のいずれかでなければなりません。&lt;/p&gt;</description></item><item><title>AWS-CLIを使ってDynamoDBを操作してみる</title><link>https://genzouw.com/entry/2019/04/27/001837/1406/</link><pubDate>Sat, 27 Apr 2019 00:18:37 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/27/001837/1406/</guid><description>&lt;p&gt;LambdaからDynamoDBを操作する必要があったのだけれども、&#10;DynamoDBにあまり触れる機会もなく今まで来ました。&lt;/p&gt;&#10;&lt;p&gt;コマンドラインからテーブルの作成やデータ投入を行ってみることにしました。&lt;/p&gt;&#10;&lt;p&gt;操作するためのツールとして &lt;a href="https://aws.amazon.com/jp/cli/"&gt;AWS CLI&lt;/a&gt; を使ってみます。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、DynamoDBの構成要素や概念を整理した内容は以下のエントリにまとめました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/231011"&gt;Amazon DynamoDBの構成要素について理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.140 Python/3.7.3 Darwin/18.5.0 botocore/1.12.130&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="dynamodbの概念コンセプトを整理してみる"&gt;DynamoDBの概念・コンセプトを整理してみる&lt;/h2&gt;&#10;&lt;h3 id="amazon-dynamodbの構成要素コンセプト"&gt;Amazon DynamoDBの構成要素・コンセプト&lt;/h3&gt;&#10;&lt;p&gt;「Amazon DynamoDB」を構成する要素については、別のエントリで整理しておきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/231011"&gt;Amazon DynamoDBの構成要素について理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上記エントリでまとめましたが、抑えておく用語は以下の４つです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;テーブル&lt;/li&gt;&#10;&lt;li&gt;項目&lt;/li&gt;&#10;&lt;li&gt;属性&lt;/li&gt;&#10;&lt;li&gt;プライマリーキー&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="コンセプト"&gt;コンセプト&lt;/h3&gt;&#10;&lt;p&gt;DynamoDBではデータを抽出する方法は大きく２つとなります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;プライマリーキー&lt;/strong&gt; で検索し項目を受け取る&lt;/li&gt;&#10;&lt;li&gt;全項目を受け取りプログラムで絞り込む&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;データ量が増えた場合は &lt;strong&gt;(2)&lt;/strong&gt; の方法は現実的ではなくなるため、 &lt;strong&gt;(1)&lt;/strong&gt; でデータを取得できるように設計する必要があります。&lt;/p&gt;&#10;&lt;h2 id="検証用のテーブル定義"&gt;検証用のテーブル定義&lt;/h2&gt;&#10;&lt;p&gt;上記の概念やコンセプトを理解した上で、今回検証用に作成したいテーブルの定義を整理しておきます。&lt;/p&gt;&#10;&lt;h3 id="検証用のtable名"&gt;検証用のtable名&lt;/h3&gt;&#10;&lt;p&gt;ユーザ情報を管理する &lt;code&gt;users&lt;/code&gt; というtableを作成します。&lt;/p&gt;&#10;&lt;h3 id="検証用の属性名"&gt;検証用の属性名&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;users&lt;/code&gt; テーブルは以下のような属性（RDSでいうところの列情報）を保持します。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;プライマリーキー?&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;email&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Y&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;first_name&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;last_name&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;age&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Number&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;「属性」には型を設定する必要があります。&#10;連想配列や配列などを指定できますが、最もよく利用するのは「文字列」と「数値」となるでしょう。&lt;/p&gt;</description></item><item><title>「Amazon Cognito」を使ってログイン機能を作成する（SNS認証あり）</title><link>https://genzouw.com/entry/2019/04/21/085627/1386/</link><pubDate>Sun, 21 Apr 2019 08:56:27 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/21/085627/1386/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ログイン認証機能を実装するための方法をいくつか調査中。&lt;/p&gt;&#10;&lt;p&gt;候補として上がっているのは大きく２つ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Amazon Cognito&amp;rdquo;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Firebase&amp;rdquo;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;まずは &lt;strong&gt;Cognito&lt;/strong&gt; の調査からすることにしました。&lt;/p&gt;&#10;&lt;p&gt;マニュアルを読みながら設定を進めて見ましたが、文章が多く初見殺しのイメージがあったので、設定時のスクリーンショットを残しておきました。&#10;そちらを共有したいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Cognito&lt;/strong&gt; の設定で躓いた方の参考になれば幸いです。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;僕はさっと AWS のマニュアルを読みました。&#10;実際に行った作業も以下のマニュアルを元に進めました。&lt;/p&gt;&#10;&lt;p&gt;( 書かれている内容通りに進められる方は当エントリを参考にする必要はないかと思います。 )&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-getting-started.html"&gt;Amazon Cognito の使用開始 - Amazon Cognito&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="cognito-アーキテクチャ"&gt;Cognito アーキテクチャ&lt;/h3&gt;&#10;&lt;p&gt;概念として認証・認可情報を管理する &lt;strong&gt;&amp;ldquo;ユーザープール&amp;rdquo;&lt;/strong&gt; と &lt;strong&gt;&amp;ldquo;ID プール&amp;rdquo;&lt;/strong&gt; というものを理解する必要があります。&lt;/p&gt;&#10;&lt;p&gt;いずれの概念もまだ掴みきれていないのですが、 マニュアルを読みつつ、触りつつ理解していこうと思います。&#10;今回触るのは &lt;strong&gt;&amp;ldquo;ユーザープール&amp;rdquo;&lt;/strong&gt; のみになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-cup-cib2.png" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="設定方法"&gt;設定方法&lt;/h2&gt;&#10;&lt;p&gt;早速設定を進めていきましょう。&lt;/p&gt;&#10;&lt;p&gt;先にも述べたとおり、 &lt;strong&gt;AWS&lt;/strong&gt; が提供してくれているマニュアル通りに進めていきます。&lt;/p&gt;&#10;&lt;h3 id="ステップ-1ユーザープールを使用してユーザーディレクトリを作成する"&gt;ステップ 1.ユーザープールを使用してユーザーディレクトリを作成する&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html"&gt;ステップ 1.ユーザープールを使用してユーザーディレクトリを作成する - Amazon Cognito&lt;/a&gt; を参考に作業を進めます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="amazon-cognito-コンソール-を開きます"&gt;&lt;a href="https://console.aws.amazon.com/cognito/home"&gt;Amazon Cognito コンソール&lt;/a&gt; を開きます。&lt;/h4&gt;&#10;&lt;p&gt;[ユーザープールの管理] を選択します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1yRJq1smof-dvIq_h383e68xRNEQe4HeF" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="ページの右上にある-ユーザープールを作成する-を選択します"&gt;ページの右上にある [ユーザープールを作成する] を選択します。&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1ijIP2QKpgqAw6SRtK1P2pkcFJ9Xdg6pc" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="ユーザープールの名前を入力しデフォルトを確認する-を選択して名前を保存します"&gt;ユーザープールの名前を入力し、[デフォルトを確認する] を選択して、名前を保存します。&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=11nz2WuEjZQ5d3QMD7WpohLNXzKiYi6Df" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="属性-ページでe-メールアドレスおよび電話番号-および-e-メールアドレスを許可-を選択します"&gt;[属性] ページで、[E メールアドレスおよび電話番号] および [E メールアドレスを許可] を選択します。&lt;/h4&gt;&#10;&lt;p&gt;設定ができたら、ページの下部にある [次のステップ] を選択して属性を保存します。&lt;/p&gt;</description></item><item><title>S3にファイルが作成されたことを検知してLambda関数でファイルを読み込む( `aws-cli` で構築)</title><link>https://genzouw.com/entry/2019/03/23/092512/1224/</link><pubDate>Sat, 23 Mar 2019 09:25:12 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/23/092512/1224/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「&lt;a href="https://genzouw.com/entry/2019/02/28/082940"&gt;S3にファイルがSFTPアップロードされたことを検知してLambdaを起動する（ &lt;code&gt;aws-cli&lt;/code&gt; で構築）&lt;/a&gt;」で、S3にファイルがアップロードされたことをフック条件にしてLambdaファンクションを実行させてみました。&lt;/p&gt;&#10;&lt;p&gt;ただ、上記のエントリではLambdaファンクションがCloudWatchLogにログを出力させるまでの実装にとどまっていました。&#10;フック条件となったS3のファイルを読み込むロジックは作成していません。&lt;/p&gt;&#10;&lt;p&gt;そこで、今回はフック条件となったS3内のファイル読み込みを試してみました。&lt;/p&gt;&#10;&lt;h2 id="ゴールとする構成"&gt;ゴールとする構成&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=13TTO-65zShudTTkcTl3s_zE99L26a7vM" alt=""&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ファイルがアップロードされる&lt;/li&gt;&#10;&lt;li&gt;アップロードを検知してLambdaファンクションを呼び出し&lt;/li&gt;&#10;&lt;li&gt;S3のファイルを読み込む&lt;/li&gt;&#10;&lt;li&gt;CloudWatchLogにログ出力&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://github.com/aws/aws-cli"&gt;aws&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.120 Python/3.7.2 Darwin/18.2.0 botocore/1.12.110&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6.7.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="作業開始"&gt;作業開始&lt;/h2&gt;&#10;&lt;p&gt;以下のエントリから今回必要な部分のみピックアップして検証していきます。&lt;/p&gt;</description></item><item><title>「Amazon API Gateway」から「Lambda」を通さずに「S3」へアクセスできるようにしてみる（ `aws-cli` で構築）</title><link>https://genzouw.com/entry/2019/03/15/165949/1189/</link><pubDate>Fri, 15 Mar 2019 16:59:49 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/15/165949/1189/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;AWSを利用したサーバレスな事例が増えてきました。&#10;例えば以下のような構成の事例がWeb上で掲載されています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1pbHEz0suFdiUpRMRYR6k-E-UcSlsfEb_" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「API Gateway」&lt;/strong&gt; から &lt;strong&gt;「Lambda」&lt;/strong&gt; を経由して &lt;strong&gt;「DynamoDB」あるいは「S3」&lt;/strong&gt; にアクセスする例は、様々な方がWeb上に掲載しています。&#10;&lt;strong&gt;「API Gateway」&lt;/strong&gt; から &lt;strong&gt;「S3」&lt;/strong&gt; へ直接アクセスするための例はあまり見つからず、またあったとしても &lt;strong&gt;AWS-CLI&lt;/strong&gt; を使って設定している例が見つからなかったため、整理してみました。&lt;/p&gt;&#10;&lt;p&gt;ちなみに設定した内容はAmazonが提供している以下のドキュメントを参考にしています。こちらのドキュメントは「AWS マネージメントコンソール」からポチポチ操作していく内容となっています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html"&gt;API Gateway で Amazon S3 プロキシとして REST API を作成する - Amazon API Gateway&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作成するapi概要"&gt;作成する「API」概要&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;S3にアクセスできる。（今回は読み取りのみ）&lt;/li&gt;&#10;&lt;li&gt;アクセス用URLは &lt;code&gt;https://&amp;lt;host&amp;gt;/&amp;lt;S3-BUCKET-NAME&amp;gt;/&amp;lt;S3-OBJECT-KEY&amp;gt;&lt;/code&gt; の形式とする。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;aws-cli&lt;/code&gt; コマンドが利用できる&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;jq&lt;/code&gt; コマンドが利用できる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;code&gt;ja&lt;/code&gt; はなくてもよいのですが、今回各AWS構成要素を作成した際のJSONレスポンスをパースしてできる限りコマンドラインのみの操作としたかったので利用してみました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.120 Python/3.7.2 Darwin/18.2.0 botocore/1.12.110&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ jq --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq-1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;&#10;&lt;p&gt;デプロイ直前までの流れは以下の通り。&#10;（デプロイは次回実施してみる。）&lt;/p&gt;</description></item><item><title>AWS-CLIでhelpを入力するのが煩わしい場合の対処としてスクリプトを作ってみた。</title><link>https://genzouw.com/entry/2019/03/14/124024/1182/</link><pubDate>Thu, 14 Mar 2019 12:40:24 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/14/124024/1182/</guid><description>&lt;p&gt;&lt;strong&gt;AWS-CLI&lt;/strong&gt; を叩きながら &lt;strong&gt;AWS&lt;/strong&gt; の各種サービスを構築する上で必要な情報を学習中です。&lt;/p&gt;&#10;&lt;p&gt;僕は画面を見ていくよりもコマンドのヘルプを見ながら試行錯誤していくほうが理解が進めやすいようです。&lt;/p&gt;&#10;&lt;h2 id="aws-cliのヘルプを引くのが面倒"&gt;「AWS-CLI」のヘルプを引くのが面倒&lt;/h2&gt;&#10;&lt;p&gt;ただ、ヘルプを引くのが面倒なのです。&#10;具体的に言うと &lt;code&gt;help&lt;/code&gt; コマンドを入力するのが面倒。&lt;/p&gt;&#10;&lt;p&gt;例えば作業中に以下のような状況になることが多い。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# どんなコマンドがあったっけ？&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# コマンド間違えた&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 内容を確認したので実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ヘルプを見るか&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# くっ...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# わかった！実行する！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 mb my-butket-name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# なんかエラー出るし！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 mb &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="ちょっとした改善としてhelpを打ち込まなくてもhelpが表示されるようにしてみた"&gt;ちょっとした改善として、helpを打ち込まなくてもhelpが表示されるようにしてみた&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;help&lt;/code&gt; と入力する手間だけでも減らそうと思って短いスクリプトを作ってみた。&#10;&lt;code&gt;aws&lt;/code&gt; コマンドは多くのコマンドが &lt;code&gt;aws &amp;lt;サブコマンド&amp;gt; &amp;lt;オプション&amp;gt;&lt;/code&gt; といった構成となるので、2つの引数が必要になります。&#10;引数が1つ以下の場合は、自動的に &lt;code&gt;help&lt;/code&gt; というオプション付きで呼び出すようにしています。&lt;/p&gt;</description></item><item><title>goofysを使ってEC2上のLinuxにS3をマウントする</title><link>https://genzouw.com/entry/2019/03/07/080500/1091/</link><pubDate>Thu, 07 Mar 2019 08:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/07/080500/1091/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;S3をファイルシステムとしてマウントするための方法を整理してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;AWSを利用していて、S3をサーバーマウントする技術として &lt;strong&gt;s3fs&lt;/strong&gt; が有名&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;s3fs&lt;/strong&gt; は遅い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;代替策として &lt;strong&gt;goofys&lt;/strong&gt; がある&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;goofys&lt;/strong&gt; は速い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;goofys&lt;/strong&gt; の方が評判が良いようなのでgoofysを検証しました。&lt;/p&gt;&#10;&lt;p&gt;ちなみに &lt;strong&gt;goofys&lt;/strong&gt; のGithubページに&lt;a href="https://github.com/kahing/goofys#benchmark"&gt;ベンチマーク&lt;/a&gt;が掲載されています。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;(引用)&#10;Using &amp;ndash;stat-cache-ttl 1s &amp;ndash;type-cache-ttl 1s for goofys -ostat_cache_expire=1 for s3fs to simulate cold runs. Detail for the benchmark can be found in bench.sh. Raw data is available as well. The test was run on an EC2 m4.16xlarge in us-west-2a connected to a bucket in us-west-2. Units are seconds.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1q-8dXVRCCZ017FGoRzuGI7soy59WsmKj" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="今回のゴール"&gt;今回のゴール&lt;/h2&gt;&#10;&lt;p&gt;起動時にS3バケットが所定のディレクトリに自動マウントされるようになるまで設定します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ちなみに、Dockerが利用できる場合にはgoofysを手軽に利用できるDockerイメージを公開していますのでお使いください。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>`aws-cli` を使ってコマンドラインからAWS EC2とVPCを構築する</title><link>https://genzouw.com/entry/2019/03/04/123533/1077/</link><pubDate>Mon, 04 Mar 2019 12:35:33 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/04/123533/1077/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Transfer for SFTP&lt;/strong&gt; の価格があまりにも高すぎたため、 &lt;strong&gt;EC2&lt;/strong&gt; 上に &lt;strong&gt;SFTP&lt;/strong&gt; サーバを構築することにしました。&lt;/p&gt;&#10;&lt;p&gt;今までは &lt;strong&gt;VPC&lt;/strong&gt; や &lt;strong&gt;インターネットゲートウェイ&lt;/strong&gt; を使わずに &lt;strong&gt;EC2&lt;/strong&gt; 作成をしていたため、これらを導入した場合の手順を整理してみました。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;aws-cli&lt;/code&gt; コマンドが利用できること&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;jq&lt;/code&gt; コマンドが利用できること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;code&gt;ja&lt;/code&gt; はなくてもいいが、今回各AWS構成要素を作成した際のJSONレスポンスをパースしてできる限りコマンドラインのみの操作としたかったので利用しました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.110 Python/3.7.2 Darwin/18.2.0 botocore/1.12.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="ネットワーク周りの設定"&gt;ネットワーク周りの設定&lt;/h2&gt;&#10;&lt;h3 id="vpcの作成"&gt;VPCの作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;span class="lnt"&gt;9&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# VPCの新規作成 =&amp;gt; 作成されたVPCのIDを保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws ec2 create-vpc &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cidr-block &lt;span class="s1"&gt;&amp;#39;172.20.0.0/16&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.Vpc.VpcId&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="subnetの作成"&gt;Subnetの作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Subnetの新規作成 =&amp;gt; 作成されたSubnetのIDを保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;EC2_SUBNET_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws ec2 create-subnet &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cidr-block &lt;span class="s1"&gt;&amp;#39;172.20.0.0/16&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --vpc-id &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.Subnet.SubnetId&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_SUBNET_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="インターネットゲートウェイの作成"&gt;インターネットゲートウェイの作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# インターネットゲートウェイの新規作成 =&amp;gt; 作成されたインターネットゲートウェイのIDを保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;EC2_INTERNET_GATEWAY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws ec2 create-internet-gateway &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.InternetGateway.InternetGatewayId&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_INTERNET_GATEWAY_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="vpcへインターネットゲートウェイを割り当てる"&gt;VPCへインターネットゲートウェイを割り当てる&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws ec2 attach-internet-gateway &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --internet-gateway-id &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_INTERNET_GATEWAY_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --vpc-id &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="ルートテーブルの設定"&gt;ルートテーブルの設定&lt;/h3&gt;&#10;&lt;p&gt;インターネットゲートウェイ経由でVPCへアクセスできるようにします。&lt;/p&gt;</description></item><item><title>S3にファイルがSFTPアップロードされたことを検知してLambdaを起動する（ `aws-cli` で構築）</title><link>https://genzouw.com/entry/2019/02/28/082940/1011/</link><pubDate>Thu, 28 Feb 2019 08:29:40 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/28/082940/1011/</guid><description>&lt;p&gt;以下のような仕組みを作る必要がありました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ユーザにSFTPプロトコルを使って、S3にファイルをアップロードしてもらう。&lt;/li&gt;&#10;&lt;li&gt;S3にファイルがアップロードされたことを検知して、何らかの処理を行う。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;AWSのサービスを組みわせて、かつできる限り &lt;code&gt;aws-cli&lt;/code&gt; のみを使ってコマンドラインで仕組みを構築してみました。&lt;/p&gt;&#10;&lt;p&gt;今回は、 &lt;strong&gt;「何らかの処理」&lt;/strong&gt; として &lt;strong&gt;Lambdaファンクションを使ってCloudWatchLogにログを書き出させてみます&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※注意：IAM周りの設定はかなり大雑把に設定しているので、参考する場合にはもっと考慮が必要！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="簡易構成図"&gt;簡易構成図&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1MiJM_T8fe2u3IhCebS54ZuhWUjJCl3uf" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="設定パラメータを整理"&gt;設定パラメータを整理&lt;/h2&gt;&#10;&lt;p&gt;AWSの各種サービス設定時に必要となる情報を事前にまとめておきました。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;設定項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;設定値&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AWS Transfer 実行ユーザ名(SFTPログインユーザ)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket-transfer-user&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AWS Transfer 実行ロール名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket-transfer-role&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S3 バケット名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S3 バケット イベント名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket-event&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lambda ファンクション名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-function&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lambda 実行ロール名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-function-role&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="事前準備"&gt;事前準備&lt;/h2&gt;&#10;&lt;h3 id="aws-cli-awsコマンドの利用可能な環境づくり"&gt;&lt;code&gt;aws-cli&lt;/code&gt; (AWSコマンドの利用可能な環境づくり)&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;aws-cli&lt;/code&gt; の利用可能環境は、以下のエントリを参考に構築済み。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/23/133626"&gt;AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="awsサービスの設定開始"&gt;AWSサービスの設定開始&lt;/h2&gt;&#10;&lt;h3 id="aws-s3バケットの作成"&gt;AWS S3バケットの作成&lt;/h3&gt;&#10;&lt;p&gt;S3バケットの作成やファイルのアップロードをコマンドラインから操作する方法は、 以下のエントリで整理済み。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/24/100022"&gt;AWSのS3バケットの作成、削除、タグ付与、ポリシー設定をコマンドラインから実行する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;参考にしながら設定を進める。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バケットを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3 mb s3://g-trigger-bucket&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バケットができたかを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3 ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-02-25 07:32:57 g-trigger-bucket&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="aws-lambdaファンクションの作成"&gt;AWS Lambdaファンクションの作成&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; ファンクションの作成や呼び出しをコマンドラインから操作する方法は、 以下のエントリで整理済み。&lt;/p&gt;</description></item><item><title>AWSのLambdaファンクションの作成、実行、削除をコマンドラインから操作する</title><link>https://genzouw.com/entry/2019/02/26/075959/1004/</link><pubDate>Tue, 26 Feb 2019 07:59:59 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/26/075959/1004/</guid><description>&lt;p&gt;&lt;strong&gt;S3にファイルがアップロードされたことを検知して、処理を行うような仕組みを作り必要がありました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;処理の部分のロジックはまだ未決定事項が多いため、とりあえずは&#10;&lt;strong&gt;Lambdaファンクション呼び出しからCloudWatchLogへログを吐き出すところまでの仕組みを作成してみることにしました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※作成したLambdaファンクションをS3へのファイルアップロードのつなぎこみは次回調査&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="aws-cli-awsコマンドの利用可能な環境づくり"&gt;&lt;code&gt;aws-cli&lt;/code&gt; (AWSコマンドの利用可能な環境づくり)&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/23/133626"&gt;AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット&lt;/a&gt; で環境構築済み。&lt;/p&gt;&#10;&lt;h2 id="aws-lambdaファンクションの作成"&gt;AWS Lambdaファンクションの作成&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; については以下の記事がわかりやすかった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://codezine.jp/article/detail/8446"&gt;初めてのAWS Lambda　～AWS Lambdaで始めるイベントドリブンアプリケーション (1/5)：CodeZine（コードジン）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Lambda作成にあたってやらないといけないことは以下の2つ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Lambdaファンクションの実行ロールを作成する&lt;/li&gt;&#10;&lt;li&gt;Lambdaファンクションを作成する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="実行ロールの作成"&gt;実行ロールの作成&lt;/h3&gt;&#10;&lt;p&gt;まずは初期ポリシーファイルを作成します。&#10;Lambdaファンクションの実行に関するフル権限を与えました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイル名は何でも良い&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;logging-function-role-policy.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Version&amp;#34;: &amp;#34;2012-10-17&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Statement&amp;#34;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Effect&amp;#34;: &amp;#34;Allow&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Principal&amp;#34;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Service&amp;#34;: &amp;#34;lambda.amazonaws.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Action&amp;#34;: &amp;#34;sts:AssumeRole&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;作成したポリシーファイルを元に、ロールを作成。&lt;/p&gt;</description></item><item><title>AWSのS3バケットの作成、削除、タグ付与、ポリシー設定をコマンドラインから操作する</title><link>https://genzouw.com/entry/2019/02/24/100022/968/</link><pubDate>Sun, 24 Feb 2019 10:00:22 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/24/100022/968/</guid><description>&lt;p&gt;S3のバケット作成、削除、ポリシー設定をWeb上から操作することが多いです。&#10;Web操作の解説も多いです。&lt;/p&gt;&#10;&lt;p&gt;でも、コマンドラインからの実行を解説しているケースはさほど多くないですね。。&lt;/p&gt;&#10;&lt;p&gt;S3はバックアップデータ置き場、ログ置き場として使うことが多いが、特に検証時に作っては消し、また作るを繰り返す&amp;hellip;&#10;繰り返しが疲れてきたのでコマンドラインでのやり方をまとめてみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ここではよく使用される &lt;code&gt;aws s3&lt;/code&gt; コマンドではなく &lt;code&gt;aws s3api&lt;/code&gt; コマンドについてできるだけ触れてみます。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="aws-cli-awsコマンドの利用可能な環境づくり"&gt;&lt;code&gt;aws-cli&lt;/code&gt; (AWSコマンドの利用可能な環境づくり)&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/23/133626"&gt;AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット&lt;/a&gt; を参照。&lt;/p&gt;&#10;&lt;p&gt;上記記事では Mac、Linux、Windowsの環境の差異を無視できるよう、またPythonなしでも動作するように &lt;strong&gt;Docker&lt;/strong&gt; を利用しました。&lt;/p&gt;&#10;&lt;h2 id="s3バケットの作成--aws-s3api-create-bucket--aws-s3-mb-"&gt;S3バケットの作成 ( &lt;code&gt;aws s3api create-bucket&lt;/code&gt; / &lt;code&gt;aws s3 mb&lt;/code&gt; )&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;aws s3api create-bucket&lt;/code&gt; コマンドを使う。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/reference/s3api/create-bucket.html"&gt;create-bucket — AWS CLI 1.16.111 Command Reference&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ここでは &lt;strong&gt;genzouw-test-bucket&lt;/strong&gt; というバケット名で作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3api create-bucket &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --bucket genzouw-test-bucket &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --create-bucket-configuration &lt;span class="s2"&gt;&amp;#34;LocationConstraint=ap-northeast-1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 環境変数 AWS_DEFAULT_REGION が設定されていれば、以下のコマンドでも良い。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## aws s3api create-bucket \&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## --bucket genzouw-test-bucket \&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## --create-bucket-configuration &amp;#34;LocationConstraint=${AWS_DEFAULT_REGION}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;何度か &lt;code&gt;--create-bucket-configuration&lt;/code&gt; オプション無しで実行してみたが、以下のようなエラーが発生しました。&lt;br&gt;&#10;&lt;code&gt;AWS_DEFAULT_REGION&lt;/code&gt; の設定があったとしても指定が必要な模様。&lt;/p&gt;</description></item><item><title>AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ)</title><link>https://genzouw.com/entry/2019/02/23/133626/963/</link><pubDate>Sat, 23 Feb 2019 13:36:26 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/23/133626/963/</guid><description>&lt;p&gt;AWSコマンドを実行するための環境づくりをしたいが、自前のMac環境だけでなく、Windows環境のことも考慮して構築したいですよね。&lt;/p&gt;&#10;&lt;p&gt;Dcokerを作って実現するための手順をまとめてみました。&lt;/p&gt;&#10;&lt;p&gt;Dockerを使えれば、MacだろうがWindowsだろうがLinuxだろうが同じ手順で &lt;code&gt;aws-cli&lt;/code&gt; 実行の環境が構築可能です。&lt;/p&gt;&#10;&lt;h2 id="事前にdockerのインストールが必要"&gt;事前にDockerのインストールが必要&lt;/h2&gt;&#10;&lt;p&gt;こめんなさい。事前にDockerのインストールはされていることが前提です。&lt;br&gt;&#10;こちらはネット上に情報が転がっているので独力で頑張ってみてください。&lt;/p&gt;&#10;&lt;h2 id="docker-hubから適当なコンテナを探す"&gt;&amp;ldquo;Docker Hub&amp;quot;から適当なコンテナを探す&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://hub.docker.com"&gt;Docker Hub&lt;/a&gt; から適当な既存のコンテナを探しました。&lt;/p&gt;&#10;&lt;p&gt;以下のコンテナがダンロード数も多く、比較的頻繁に更新されてそうでした。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/mesosphere/aws-cli/"&gt;mesosphere/aws-cli&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="dockerを使った-aws-cli-を早速試してみる"&gt;Dockerを使った &lt;code&gt;aws-cli&lt;/code&gt; を早速試してみる&lt;/h2&gt;&#10;&lt;p&gt;実行のためには、以下の３つの情報が必要。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;id&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;key&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;region&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;環境変数として定義して &lt;code&gt;export&lt;/code&gt; すれば利用可能ということで早速試してみます。&lt;/p&gt;&#10;&lt;h3 id="iam管理コンソールページからキー情報を取得"&gt;IAM管理コンソールページから、キー情報を取得&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://console.aws.amazon.com/iam/home?#/users"&gt;IAM Management Console&lt;/a&gt; のページを開く。&lt;/li&gt;&#10;&lt;li&gt;左サイドのメニューから「ユーザー」を選択すれば、現在登録されているIAMユーザの一覧が表示されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;既存のものを使いたい&lt;/strong&gt; 場合はそれをクリック。 &lt;strong&gt;新しいものを使いたい&lt;/strong&gt; 場合は「ユーザーを追加」ボタンをクリック。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;今回は既存のものを利用したいので、クリックしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1iW4-BUksg2tsFRCbfj0nKqDjd8iU6LhQ" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「アクセスキー」&lt;/strong&gt; は最大2つまで登録できます。今回は既存のものがすでに登録してあったが &lt;strong&gt;忘れてしまったため&lt;/strong&gt; 新しく作成。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1Hjwi-Jq8TgpzKQ5QSaKOjPx2xzzmtWqj" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ボタンを押すと即座に新しいアクセスキーが作成されます。&#10;このタイミングでしっかりメモしておかないと2度と &lt;strong&gt;シークレットアクセスキー&lt;/strong&gt; は確認できないので、メモしておきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1nGF_SZAyif8LFDaoVGAyy4RPPGEAkWQ8" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="環境変数を設定"&gt;環境変数を設定&lt;/h3&gt;&#10;&lt;p&gt;Bash（ Windowsの方はコマンドプロンプトかPowerShell ）を開いて、以下の環境変数を設定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;先程のページのアクセスキーID&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;先程のページのシークレットアクセスキー&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ap-northeast-1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;AWS_DEFAULT_REGION&lt;/code&gt; は一番良く使うデフォルトのリージョンを指定する必要があります。（ &lt;strong&gt;僕の場合は東京リージョン&lt;/strong&gt; ）&#10;AWSの以下のページから自分がよく使うものを１つ選んで設定すればよいです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html"&gt;https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Bash起動時に自動的に環境変数が設定されるように、 &lt;code&gt;~/.bashrc&lt;/code&gt; ファイルに追記しておくとよいでしょう。&lt;/p&gt;</description></item></channel></rss>