雑記帳
2016-01-05 (Tue) [長年日記]
■ [PostgreSQL] PostgreSQLでE-mailアドレスのドメインを追加する
PostgreSQLは、ドメイン(いわゆるデータ型)を定義することができる。よく使うデータの代表として、E-mailアドレスがある。これをドメインとして、定義したいと思う。
E-mailをチェックする方法として、いくつか方法があると思う。今回は下記のページを参考にしてやってみる。
ここでは、PostgreSQLの拡張であるplperluからPerl ModuleであるEmail::Addressを使ってチェックしている。
今回利用する環境は、CentOS 7に http://yum.postgresql.org/ のyumリポジトリからPostgreSQL 9.4をインストールしている。
Perlモジュールをインストールする
PerlのEmail::Addressを使うため、先にインストールしておく。
$ sudo yum install -y perl-Email-Address
plperluをインストールする
PostgreSQLでPerlを使うための拡張である、plperluをインストールする。
$ sudo yum install postgresql94-plperl
インストールできたら、PostgreSQLを再起動する。
$ sudo systemctl restert postgresql-9.4
インストールできたのかを確認する。
$ psql -Upostgres postgres=> select * from pg_available_extensions; name | default_version | installed_version | comment ---------+-----------------+-------------------+---------------------------------------- plpgsql | 1.0 | 1.0 | PL/pgSQL procedural language plperl | 1.0 | 1.0 | PL/Perl procedural language plperlu | 1.0 | | PL/PerlU untrusted procedural language (3 行)
plperluが含まれているので、利用できるようだ。
データベースで拡張を使えるようにする
今回はexampleデータベースで使う。
example=# create extension plperlu; CREATE EXTENSION
拡張の一覧を確認する。
example=# \dx
インストール済みの拡張の一覧
名前 | バージョン | スキーマ | 説明
---------+------------+------------+----------------------------------------
plperl | 1.0 | pg_catalog | PL/Perl procedural language
plperlu | 1.0 | pg_catalog | PL/PerlU untrusted procedural language
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(3 行)
plperluの他にも、plperl, plpgsqlが利用できる状態であるようだ。
E-mailをチェックする関数を作成する
下記のSQLを実行する。
CREATE OR REPLACE FUNCTION check_email(email text) RETURNS bool LANGUAGE plperlu AS $$ use Email::Address; my @addresses = Email::Address->parse($_[0]); return scalar(@addresses) > 0 ? 1 : 0; $$;
問題なければ、関数として登録される。
example=# \df
関数一覧
スキーマ | 名前 | 結果のデータ型 | 引数のデータ型 | 型
----------+-------------+----------------+----------------+----------------
public | check_email | boolean | email text | normal(通常)
(1 行)
ドメインを作成する
ここまでで、やっとドメインを作る準備ができた。CREATE DOMAINを実行して、ドメインを作成する。
example=# create domain email_address AS text check (check_email(VALUE)); CREATE DOMAIN
問題ないか確認する。
example=# \dD
ドメイン一覧
スキーマ | 名前 | 型 | 修飾語 | チェック
----------+--------------------+--------+----------+----------------------------------------
public | email_address | text | | CHECK (check_email(VALUE))
(1 行)
試す
試しにテーブルを作成して、動作を確認する。
example=# create table emails (email_address email_address); CREATE TABLE
紛らわしいSQLになってしまった。まぁいい。データを投入してみる。
example=# insert into emails (email_address) values ('test@example.com');
INSERT 0 1
入った。では、E-mailアドレスではないものを入れてみる。
adminpack_development=# insert into emails (email_address) values ('test.@example.com');
ERROR: ドメインemail_addressの値が検査制約"email_address_check"に違反しています
ちゃんとエラーになった! 素晴らしい。
これで、E-mailが必要な場面で、アプリによるE-mailを検証する実装が妥当でなくても、データベースを守ることができる。
2016-01-07 (Thu) [長年日記]
■ [AWS] ap-northeast-2 リージョンのCloudTrailのログのPutを許可する
本日、ap-northeast-2リージョンが新しく利用可能になった。CloudTrailを有効にしようとしたらエラーになってしまった。
Incorrect S3 bucket policy is detected for bucket: iret.cloudtrail.logs (Aws::CloudTrail::Errors::InsufficientS3BucketPolicyException)
S3 Bucket Policyに、適切な権限の設定が必要だった。
CloudTrail Supported Regions を見ると、ap-northeast-2のAWS Account ID *1 が記載されている。Principalとして、下記のARNを指定する。
arn:aws:iam::492519147666:root
Policyは、以下のようになる。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::903692715234:root",
"arn:aws:iam::035351147821:root",
"arn:aws:iam::859597730677:root",
"arn:aws:iam::814480443879:root",
"arn:aws:iam::216624486486:root",
"arn:aws:iam::086441151436:root",
"arn:aws:iam::388731089494:root",
"arn:aws:iam::284668455005:root",
"arn:aws:iam::113285607260:root",
"arn:aws:iam::492519147666:root"
]
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::your-bucket-name"
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::903692715234:root",
"arn:aws:iam::035351147821:root",
"arn:aws:iam::859597730677:root",
"arn:aws:iam::814480443879:root",
"arn:aws:iam::216624486486:root",
"arn:aws:iam::086441151436:root",
"arn:aws:iam::388731089494:root",
"arn:aws:iam::284668455005:root",
"arn:aws:iam::113285607260:root",
"arn:aws:iam::492519147666:root"
]
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
*1 AWS Account Numberでなかったっけ?
