プログラミング備忘録

仕事で覚えたことのまとめ

SQLite入門(3) CSV、TSVからデータを作る

前回のあらすじ

データベースの構造を理解し、クエリを使ってデータベースにデータを入力した。

ファイルからテーブルのデータを作る

通常通りにカラムのデータ型を指定してテーブルを作成する。 .mode csvCSV取込が可能な状態にして、.import [ファイル名] [テーブル名]で取込ができます。

※ TSVの場合は、.mode tabs になります。

既存のテーブルへ取り込む場合、CSVの1行目も含めて取り込んでしまうので、テーブル作成時に指定しておきましょう。

※パスによるCSVファイルの指定方法はLinuxのものを参照ください。

※なお、日本語の入っているファイルパスだと取り込みができない模様。

sqlite > create table stand_list(stand_name text , master_name ,del_flag);

sqlite > .mode csv
sqlite > .mode csv.imoport ./Data.csv my_table

一方、指定した名称のテーブルがない場合は1行目をカラム名称として取込を行いテーブルも自動で生成します。 生成されるテーブルはすべてデータ型はtextになります。

実際にやってみる

取り込むデータ(new_data.csv

id first_name last_name del_flag
1 佐藤 0
2 鈴木 陽翔 1
3 高橋 0
4 田中 0

取込実行

sqlite > .mode csv
sqlite > .import ./new_data.csv name_list

スキーマ確認

sqlite > select * from sqlite_master where type='table' and name  = 'name_list';
table,name_list,name_list,3,"CREATE TABLE ""name_list""(
  ""id"" TEXT,
  ""first_name"" TEXT,
  ""last_name"" TEXT,
  ""del_flag"" TEXT
)"

次回

クエリの結果をファイルに出力する

SQLite入門(2) データベースの階層構造を理解する

前回のあらすじ

C\sqlite > sqlite3 my_database.db
SQLite version 3.35.1 2021-03-15 16:53:57
Enter ".help" for usage hints.
C\sqlite >

無償で使えるデータベース管理ツール「SQLite」をPCへ導入、データベースを作成した。

データベースにデータを入れる

前回のsqlite3 my_database.dbを実行した段階では、.dbファイルにまだデータはおろか、データを入れる枠すら作成されていない状態です。 データベースの階層構造を理解しつつ、データを入れる枠であるテーブルとカラムを作成します。

データベースの階層構造

f:id:nigou2:20210724181503p:plain

データの型

SQLiteの型 説明 MySQLの型
NULL NULL値
TEXT テキスト CHAR, VARCHAR
INTEGER 整数 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
REAL 浮動小数点数 FLOAT, DOUBLE
BLOB Binary Large OBject。入力データをそのまま格納

※DATETIME(日付)型はSQLiteではTEXT型として扱われる。 ※MySQLではVARCHAR(10)のようにデータのバイト数上限を指定できるが、SQLiteでは適用されない。

詳細なまとめ

# テーブルを作る

sqlite > create tabel my_table(id integer , name text , del_flag integer);

create table [テーブル名]\(カラム名 データ型\);

末尾のセミコロンを忘れずに!

データ型の後ろに not nullと記載するとNULLをデータ上に生成しないように指定など、テーブル作成にまつわるオプションは数多く存在する。参考

作ったテーブルを確認する

.tableでデータベースに上に作成したテーブルを確認できる。

sqlite> .table
my_table

どんな作り方をしたかを見たい場合はsqlite_masterからSELECTする。 以下はさらにwhereでテーブルの名前で指定している。 .mode line で行ごとに出力させると以下のように表示される

sqlite > .mode line
sqlite > select * from sqlite_master where type ='table' and name='my_table'
        type = table
      name = my_table
tbl_name = my_table
rootpage = 2
          sql = CREATE TABLE my_table (id integer , name text , del_flag integer)

データを入れる

INSERT INTO テーブル名 VALUES(値1, 値2, ...);でデータをテーブルへ格納していく。

sqlite > insert into my_table values('1','tom',0)
sqlite > select * from my_Table
          id = 1
   name  = htom
del_flag = 0

入っているデータを全て確認したいならselect * from [テーブル名]

テーブルを削除する

drop [テーブル名];でテーブルごと削除ができます。

sqlite > drop my_table;

最後に

コマンドの末尾には「;」を付けるのが必須です。お忘れなく!

次回

CSVをそのままテーブルに取り込む

SQLite入門(1) とりあえず導入する

SQLiteを選ぶ理由 、それは「 安さ 」

例えばIDとパスワードのマスタを保有しておいて入力値と参照する、というように、Webアプリケーションにはマスタの類やデータベースは必須になります。

いざ開発となったときに、もちろん直接Web上でデータベースを構築してもいいのですが、Web環境は有償のものが多く、何度も検証しているとその分お金がかかります。

一方で自分のPCにローカルな環境を構築する分には大概安上がりで済みます。

本記事は、とりあえずデータベースを構築する勉強がしたい、SQLを勉強したいという方向けに、無料で使えるデータベース管理システムであるSQLiteを紹介する記事になります

導入手順(Windows

わかりやすい説明

ダウンロードしたファイルは解凍し適宜実行用のフォルダに移動させます。 この説明では「C:\sqlite」というフォルダに格納します。 解凍直後の時点では「sqlite3.exe」「sqlite3_analyzer.exe」「sqldiff.exe」の3ファイルが入っているはずです。

起動確認(コマンドプロンプト

コマンドプロンプトで以下2行を順次実行します。 1行目で移動しているフォルダは「sqlite3.exe」らを移動したフォルダです。 2行目のmy_databaseの部分が任意のデータベース名になります。このとき、拡張子の.dbは忘れずに付与してください。

cd C:\sqlite
sqlite3 my_database.db


以下のようにバージョン情報が返ってきます。 また、カレントディレクトリであるC:\sqliteに「my_database.db」というファイルが生成されています。

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.

コマンドプロンプトの左側の表示がsqlite>というようになっていれば導入は成功、無事SQLiteの実行準備は整いました。

.exitで、SQLiteモードから抜けてコマンド実行モードに戻ります。

次回

データベースの構造を理解し、実際にデータを作成する。

何とかして無料でPowerAutomateからHTTPリクエストしたかった人生でした

PowerAutomateからAWSに連携させたい

HTTPリクエストでもAWSQueでもいいから、なんとかしてFormの回答内容をAWSに連携させたい。

やりたいこと:サーバー版PowerAutomateでHTTPリクエストする

PremiumアカウントにすればHTTPリクエストもAWSコネクタも使用できるのでそれで解決するが、いかんせん会社で使用しているアカウントだとアカウントの権限をおいそれと変更できないですよね笑。 Windows10に内包されている無償版のアカウントで何とかできるんじゃないかと。だってHTTPリクエストぞ?自動化に必須じゃあないか。

無料ユーザーにはAPIもたたかせない、ってコト?

結論:私の力ではダメでした。 20210723

うん、無理だわこれ。以下今回検証した内容。もちろん、

検証したこと:Office ScriptをPowerAutomateから実行させる

Step1 とりあえずHTTPリクエストを飛ばす相手を探す

とりあえずGETメソッドで実行できれば問題ないはず・・・

今回使用するのは「Official Joke API」。

f:id:nigou2:20210723152926p:plain GETでリクエストするとsetup =”フリ”とPunchline="オチ"を返してくれます。

Step2 Office Scriptを準備する

OfficeScriptは通常のエクセルマクロよろしく、Web上のエクセルファイルとワンセットでの呼び出しになるので、OneDriveにファイルを適当に作ります。

※テストしたときの階層はこんな感じ

One Drive for Business(自分のファイル)
  ┗ 簡易作業
      ┗ MyWorkbook.xlsx

そのままOneDrive上でファイルを開くと、Excel for the Web で開けます。 特にセルなどは変更せず、リボンの「自動化」から「すべてのスクリプト」を押します。 f:id:nigou2:20210723154225p:plain

画面右側に立ち上がるコードエディターの「+新しいスクリプト」を押し、

function main(workbook: ExcelScript.Workbook)
{
  // Your code here
}

とだけ記載されたエディタが開けたら準備は万端です。

Step3 HTTPリクエストを行うOfficeScriptを記載する。

エディタのコードをすべて消し、以下を貼り付けます。

function main(workbook: ExcelScript.Workbook): Promise<void> {
  let fetchResult = await fetch('https://official-joke-api.appspot.com/jokes/random');
  let json: JSONData = await fetchResult.json();
  console.log(JSON.stringify(json));
}
interface JSONData {
  id: number;
  type: string;
  setup: string;
  punchline: string;
}

実行を押してテストすると、エディタの下のコンソールに結果が出力されました。 f:id:nigou2:20210723154638p:plain

名称を適当に変更し、スクリプトを保存したら準備完了です。あとはPower AutomateでこのOffice Scriptを実行させます。

Step4 PowerAutomateのFlowを作成する

とりあえず手動でフローを実行する簡単なつくりにします。

トリガーは「手動」、 f:id:nigou2:20210723154942p:plain アクションは「スクリプトの実行」 f:id:nigou2:20210723155028p:plain アクションの詳細を下記のように選択し f:id:nigou2:20210723155324p:plain 保存すれば完了です。

早速テストします。

・・・・・・

f:id:nigou2:20210723155925p:plain

Error!

結論

FetchAPIはOfficeScript単体では使えるが、Power Automateから実行させようとするとNot Defined扱いとなり、実行できない(?) axiosでのHTTPリクエストに至ってはOfficeScriptのエディタ時点で使えませんでした。 解決方法ご存じの方、助けてください・・・!

S3にファイルアップロードさせたい ~SDKを使ってみる~

目標

AWSCLIをインストールしていない人間でもファイルをS3にアップできるようにしたい。 社内の人間だけが利用できる状態だとベスト。

今回作るもの

ファイルを選び、ボタン押下で所定のバケットへファイルをアップロードするだけのHTMLの画面。

見栄えやセキュリティとかはいったん無視して、まずは基本骨子を作成する。

工程

  1. ファイルをアップするバケットを作る
  2. CognitoでUserPoolIdを取得する
  3. HTMLで画面を作る
  4. JavaScriptSDKでファイルアップロードのコーディングを行う
  5. HTMLにJavaScriptを連携する

Step1 ファイルをアップするバケットを作る

通常のバケット同様に作成し、アクセス許可のタブから一番下のCross-Origin Resource Sharing (CORS)を編集します。

CORSは複数のオリジン間におけるHTTPリクエストの許可情報、すごいざっくり表現するならAWS以外のWebページからのHTTPリクエストを許容するか、という設定になります。ここが空白だと、HTMLとJavaScriptを作って画像をアップするというHTTPリクエストを行ってもバケット側が拒否してしまいます。

そのため、編集のボタンを押し下記のJsonを貼り付け、リクエストを許可させます。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "HEAD",
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ]
    }
]

なおこの時、ブロックパブリックアクセスはすべてONで問題ないです。

f:id:nigou2:20210719101858p:plain

Step2 CognitoでUserPoolIdを取得する

AWSのコンソールにログインした後、Cognitoにアクセスし、左側のIDプールの管理ボタンを押します。 f:id:nigou2:20210717161909p:plain

表示される画面で# 目標 AWSCLIをインストールしていない人間でもファイルをS3にアップできるようにしたい。 社内の人間だけが利用できる状態だとベスト。

工程

  1. ファイルをアップするバケットを作る
  2. CognitoでUserPoolIdを取得する
  3. HTMLで画面を作る
  4. JavaScriptSDKでファイルアップロードのコーディングを行う
  5. HTMLにJavaScriptを連携する

Step1 ファイルをアップするバケットを作る

通常のバケット同様に作成し、アクセス許可のタブから一番下のCross-Origin Resource Sharing (CORS)を編集します。

CORSは複数のオリジン間におけるHTTPリクエストの許可情報、すごいざっくり表現するならAWS以外のWebページからのHTTPリクエストを許容するか、という設定になります。 ここが空白だと、HTMLとJavaScriptを作って画像をアップするというHTTPリクエストを行ってもバケット側が拒否してしまいます。

そのため、編集のボタンを押し下記のJsonを貼り付け、リクエストを許可させます。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "HEAD",
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ]
    }
]

Step2 CognitoでアイデンティティプールIDを取得する

Cognitoって何?

AWSアカウントの認証情報がなくてもAWSソリューションを使用できるようになるアイデンティティプール(トークンのようなもの)を発行する。このアイデンティティプールには必要十分のIAMロールを紐づけておく必要がある。

アイデンティティプールの設定方法

AWSのコンソールにログインした後、Cognitoにアクセスし、左側の「IDプールの管理」ボタンを押します。 f:id:nigou2:20210717161909p:plain

表示される画面で「新しいIDプールの作成」を押し、IDプール名を入力します。 またこの時、認証されていないIDに対するアクセスの許可のチェックボックスをONにします。 f:id:nigou2:20210717162404p:plain

次に、Cognitoで発行されるIAMロールを確認します。

f:id:nigou2:20210717163955p:plain

新規で発行されるアイデンティティプールに紐づき新規で作成されるIAMロールについて表示されます。 この後各種AWSのリソースを触れるようにロールにポリシーを設定するので、(デフォルトではPutEventsのみ許可) 検索しやすいように名称を変更しても構いません。

画面右下の「許可」のボタンを押したらアイデンティティプールの作成は完了です。

「AmazonCognitoでの作業開始」と表示されたページが表示されますので、プラットフォームのプルダウンから「javaScript」にします。

AWS認証情報の取得」の枠に下記が表示されます。実際にJavaScriptをコーディングする際に使用しますので、コピーしておきます。

// Amazon Cognito 認証情報プロバイダーを初期化します
AWS.config.region = 'ap-hogehoge-1'; // リージョン
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'ap-hogehoge-1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
});

アイデンティティプールの使用するIAMロールのポリシーを変更

AWSの検索窓などからIAMのコンソールを表示し、左にある「ロール」を選択します。 f:id:nigou2:20210719095926p:plain 表示される検索窓に、先ほどCognitoのアイデンティティプールを作成したときに同時に発行されているIAMのうち、 認証なしアクセスのときに使用されるロール(UnAuthなどとついているもの)を検索します。

f:id:nigou2:20210719100247p:plain 押下後に表示される画面の中程にある「ポリシーをアタッチします」という青いボタンを押します。

ポリシーのリストが表示されるので、検索窓に「AmazonS3FullAccess」を入力し、チェックボックスを入れて、画面右下の「ポリシーをアタッチ」のボタンを押します。 f:id:nigou2:20210719100805p:plain これで、Cognitoで発行されるアイデンティティプールはS3のファイルにアクセスできるようになりました。

※もし特定のバケットにのみアクセスさせる、あるいはファイルを置くのみにしたい場合は、上記方法ではなくポリシーの作成を行う必要があります。

Step3 HTMLで画面を作る

<html>
    <head>
    <title>Sample</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>

        <div class="container" >
            <div class="content">
                <div>
                ファイル選択
                </div>
                <input type="file" id="getfile-button" multiple /> 
            </div>
            <div class="content">
                <button id="upload-button">アップロード</button>
                <div id="results"></div>
            </div>
        </div>
    </body>
</html>

実際の画面 f:id:nigou2:20210717144255p:plain

この時、inputタグとbuttonタグにはIDを付与しておきます。

Step4 JavaScriptを用意する

下記のJSファイルを準備します。

// S3の認証情報
AWS.config.region = 'ap-northeast-1'; 
AWS.config.credentials = new AWS.CognitoIdentityCredentials({IdentityPoolId: 'XXXXXXXX'});

// アップするS3のバケット、フォルダ情報
var bucket = new AWS.S3({params: {Bucket: 'upload_bucket'}});
var foldername = 'myFolder';
var rightNow =  new Date();
var format_date = rightNow.toLocaleDateString();
var format_time = rightNow.toLocaleTimeString();
var folder_Path = foldername + '/' + format_date + '/' + format_time

// HTML側のオブジェクト
var getfile_button = document.getElementById('getfile-button');
var upload_button = document.getElementById('upload-button');
var results = document.getElementById('results');

// アップロードボタン押下時の動作
upload_button.addEventListener('click', function() {
  var file = getfile_button.files[0];
  if (file) {
      for (let i=0 ; i < getfile_button.files.length;i++ ){
          var tgtfile =getfile_button.files[i];
          var params = {Key:folder_Path + "/"+ tgtfile.name, ContentType: file.type, Body: file};
          bucket.putObject(params, function (err, data){
              results.innerHTML = err ? 'ERROR!' : 'uploaded';
          });
          results.innerHTML = 'error';
      };    
  } else {
      results.innerHTML = 'no file';
  };

})

// S3の認証情報の2行に、Cognito設定時にコピーした認証情報そのままです。

// アップするS3のバケット、フォルダ情報の1行目にアップするバケット、2行目のfoldernameバケット直下のフォルダの名称、folder_Pathはボタン押下差荒れた日時をもとにファイルを分けるために使用しています。

// アップロードボタン押下時の動作以降は、ボタンに対してイベントを付与し、アップ対象として指定したファイルの分だけbucket.putObjectを繰り返します。

Step5 HTMLにJavaScriptを連携する

最後にHTML側の</body>の直前に

    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.922.0.min.js"></script>
    <script src="上記のJSのパス"></script>

を記載すると、HTMLにScriptが連携されます。

公式を見ながら設定していきます。

まとめ

あとはこのHTML、JSファイルを社内の人間しかアクセスできない場所に置くなど、セキュリティ面だけ整理すればCLIを持っていなくてもアップロードが可能になります。

AWSコンテンツへのアクセスを限定開放する黒田如水の画像下さい!!!!(3)CloudFrontでマルチオリジンを設定する

あらすじ

黒田家のAWSのS3にあるファイルやAPIを特定の相手のみが利用できる形で公開するために、CloudFrontを使ってみよう。 だって、亡き友竹中半兵衛重治が言い残したのだから...(エモポイント)

前回CloudFrontのDistributionを作った黒田如水は、今回一つのDistributionから複数のコンテンツへアクセスできるよう設定する。

CloudFrontとは

S3やAPIAWSのアカウントを持っていない人でも、条件に合致するならアクセスできるようにする、という仕組みです。 もしくはWeb上のアクセスの関所。

Distributionとは

DistributionはCloudFront上に置かれた関所一つ一つになります。 この関所を通過することで、バケットポリシーやリソースポリシー上はアクセスをブロックしていたとしても、コンテンツを配布することが可能です。

DistributionOriginをさらに追加する(マルチオリジンを設定する) v20210531

AWSコンソールでCloudFrontを開き、対象のDistributionのIDをクリックし、画面上部のタブからOrigins and Origin Groupsをクリックします。

f:id:nigou2:20210710164608p:plain

表示される画面からCreate Originをクリックします。

OriginAPI Gatewayを追加設定する場合(APIのマルチオリジン)

Origin Domain Nameに、APIのステージを除いたエンドポイントのURLを入力します。 この時、Origin Pathは空白にします。 Minimum Origin SSL ProtocolTLSv1.2Origin Protocol PolicyHTTPS Onlyにします。

f:id:nigou2:20210710164813p:plain

ここまで出来たら右下のCreateを押します。

このオリジンにアクセスを分岐させるために、Behaviorsを更新します。 画面上部のタブからBehaviorの編集画面に移動し、Create Behaviorを押します。 f:id:nigou2:20210710164906p:plain

Path Groupに、先ほどのAPIのステージを入れ、/*をつなげます。 Origin and Origin Groupは先ほど設定したオリジンを、 Viewer Protocol PolicyHTTP and HTTPSを入力します。 このCloudFrontを通して実行を許可させるAPIのメソッドに対応して、 Allowed HTTP Methodsも変更します。(迷ったら3つ目のものでOK)

f:id:nigou2:20210710165043p:plain

以上を設定したら右下のCreateを押します。

補足

考え方としては

Cloud Frontのドメイン => ステージを除いたエンドポイントURL Behavior       => ステージ名

のような対応になります。

OriginにS3バケットを追加設定する場合(S3のマルチオリジン)

前提として、以下のような構造のバケットをマルチオリジンにします。 バケット直下にCloudFrontを経由して配信したいファイルをまとめておくフォルダを作成します。

S3
┣ myBucket -バケット-
┃    ┣ test.png                   -画像A-
┃  ┗ s3test
┃    ┣ test.png        -画像B-
┃      ┗  test2.png
┗ ...

Originを追加します。この時、Origin Pathは空白にします。 f:id:nigou2:20210710165321p:plain

Behaviorを追加します。この時、Path Patternに、Originに指定したバケットのフォルダオブジェクトの名前を入力します。

f:id:nigou2:20210710165349p:plain

以上を設定したら右下のCreateを押します。

補足

バケットの中のコンテンツにたどり着くまでの手順の考え方ですが、 Originの振り分けに使用されたPathPatternは無視されず、リクエストに残ります。

振り分けとオリジンの取得の結果、 HTTPリクエストのCloud_Front_Domain / Behavior_PathPattern / test.png が cloudfront-to-s3-test-aoki/ Behavior PathPattern / test.png に替わるので、 cloudfront-to-s3-test-aoki直下のtest.png(画像A)を取得するのではなく、 Behavior_PathPatternと一致するフォルダの中のtest.png(画像B)を取得します。

Origin Pathを空白にしている理由は、このリクエストの考え方が一層ややこしくなるからです。

逆に言えば、複数のS3バケットをマルチオリジンを設定する場合、配信コンテンツの入っているフォルダ名は、バケットをまたいで重複できない、ということになります。

ここまででできたこと

リクエスト内容に応じて対応するコンテンツを配信する仕組み (関所を通らなければ辿り着けない場所の追加)

やらないといけないこと

アクセス制限のルールの設定 (関所の門番を働かせる)

f:id:nigou2:20210710165439p:plain

f:id:nigou2:20210710165451p:plain

流石「今世の張良」とうたわれた名軍師、黒田如水。 複数コンテンツのアクセス時に通過する場所がCloudFrontに集まっていることの利便性を理解している・・・

次は作ったDistributionにアクセスルールを紐づける工程になります

AWSコンテンツへのアクセスを限定開放する黒田如水の画像下さい!!!!(4)AWSWAFのアクセスルールをCloudFrontに適応する

あらすじ

黒田家のAWSのS3にあるファイルやAPIを特定の相手のみが利用できる形で公開するために、CloudFrontを使ってみよう。 だって、亡き友竹中半兵衛重治が言い残したのだから...(エモポイント)

前回CloudFrontから複数のコンテンツへのアクセスを可能にするマルチオリジンを実現した黒田如水、今回は肝心のアクセス制限ルールを適用するようだ。

大まかな流れ

  • WAFの中のIP SetでIPアドレスAWSに登録する。
  • 登録したIPアドレスを元に、IPアドレスアクセス許可(ないし拒否)のルールを作る
  • 作成したアクセス許可ルールをCloudFrontに適用する

アクセス制限のためのルールを作成する v20210607

ここではCloudFrontの外の仕組みである、WAFというサービスを使用します。 このWAFで作成したアクセス制限のルールを、CloudFrontDistributionに適用する、という流れです。

ルールに使用するIPアドレスを登録する

サービス一覧からAWSWAFを立ち上げます。 f:id:nigou2:20210710173327p:plain

左のペインから IP setsを選び、画面右上のCreate IP setを選びます。 f:id:nigou2:20210710173406p:plain

IPアドレスを入力します。 RegionはデフォルトからGlobalに変更してください。 IP addressesにアクセスを許可する(あるいは拒否する)IPアドレスを入力します。

f:id:nigou2:20210710173454p:plain

アクセスルールを作る

画面左のペインからWeb ACLを選び、画面左上のCreate web ACLを押下します f:id:nigou2:20210710173531p:plain

表示される画面のうちResource typeは 今回のようにCloudFrontに対して適用するルールの場合は CloudFront distributionに必ず設定してください。

f:id:nigou2:20210710173639p:plain

Nextを押し、表示される画面のAddRuleのプルダウンから Add my own rules and rule groupsを選択します。

f:id:nigou2:20210710173747p:plain

下図の画面が表示されるので Rule TypeからIP Setを選び、 ル―ルの名前の入力とルールが適用されるIPセットのプルダウンの選択を済ませます。 最後にActionの箇所でプルダウンから選択した IPセットにしたいして動作(ここでいうとCloudFrontのアクセス)を 許可(Allow)するのか、拒否(Block)するのかを選びます。 ここでは、IPセットのみアクセス可能にしたいので、Allowとします。

f:id:nigou2:20210710173814p:plain

右下のAdd ruleでルールの作成を終了します。 最後に戻ってきた画面でBlockを選びます。

f:id:nigou2:20210710173840p:plain

これで、IPアドレスに合致するものはアクションが可能、合致しないIPアドレスの場合はアクションを拒否、というルールが出来ました。

次のSet rule priorityは、複数のルールを登録した場合の処理の優先順位です。 1つしかルールを作成、設定していないので、何もせずNextを押します。 さらに次のConfigure metricsは、CloudWatch上の表示を決める部分なので、デフォルト値で問題ないです。

最後に、Review and create web ACLで、自分の作成したルールを確認し、画面最下部のCreate web ACLで完了です。

作ったアクセスルールをCloudFrontに設定する

CloudFrontに戻り、ルールを適用するDistributionを開き、Editのボタンから編集画面に移動します。 f:id:nigou2:20210710173926p:plain

開いた画面のAWS WAF Web ACLのプルダウンから、先ほどAWFで作成したルールを選んで、右下の「yes,Edit」で完了です。 f:id:nigou2:20210710174019p:plainf:id:nigou2:20210710174019p:plain

テスト

登録したIPアドレスでアクセスすると図のように正常にアクセスが、

f:id:nigou2:20210710174342p:plain

それ以外でアクセスすると下記のようなアクセス拒否のメッセージが表示されます。

403 ERROR
The request could not be satisfied.
Request blocked. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
Generated by cloudfront (CloudFront)
Request ID: **********************************

できたこと

一つのアクセスルールを複数のS3、APIゲートウェイに適用する。

f:id:nigou2:20210710174443p:plain

まとめ

  • 旗印がIPアドレス、つまりWeb上の所属を表す
  • CloudFrontに適用したAWFのルールが門番となり、通行を許可したり、拒否したりという判断を行っている。
  • アクセス時のBehaviorが目的となるOriginへの分岐をつかさどる
  • Originはコンテンツそのものを表す。

黒田家のその後

慶長5年9月、ついに関ヶ原にて石田三成徳川家康が衝突。

黒田如水とその息子長政はAWSというクラウドストレージに寝返りに必要な情報を置き、その成果を十分に発揮。 家康は戦後、黒田長政の右手を三度取って礼を言ったとされる。

このことを聞いた如水は息子に対し「その間左手は何をしていたのか」と長政に尋ねた。自分なら家康○して天下を取るだろうに。

長政は答えて言う。

「某しかAWSのアカウントを持っていない故、福島殿のファイルを代わりにアップしていた」

豊前の大名黒田家の受難は続く。