CloudFrontでリファラがおちる
CloudFrontでリファラがおちる
CloudFrontを通したHTTPリクエストで、リクエストヘッダからrefererが抜け落ちているとのレポート。
バックエンド側のHTTPログをみるとたしかにリファラ部分が "-"になってる。
なぜじゃと調べることしばし。
ディストリビューションの「ビヘイビア」がおかしいことに気づきました。
修正するには以下。
- ディストリビューションを選択
- ビヘイビアタブをクリック
- リクエストに当該するパスパターンを選択して編集をクリック
- 下の方「キャッシュキーとオリジンリクエスト」のところで "Cache policy and origin request policy" を選択
Legacy cache setting ならヘッダを指定してあげればいいみたいです。
データセンタのPostgreSQLをAmazonRDSへコピーする
データセンタのPostgreSQLをAmazonRDSへコピーする
データセンタのLinux上で動作しているPostgreSQLをAmazonRDSへコピーしたい。
環境としてはこんな。
作業端末からVPC中のEC2にはssm経由でssh可能だが、RDSにはTCP/5432でつなぐことはできない。
また、データセンタ中のPostgreSQLにはTCP/5432で接続可能。
AWS中のEC2へはssmを通して直接sshすることができるようになっています。
簡単に考えるとデータセンタ側のPostgreSQLをdumpして、ファイルをVPCにアタッチできるところへ移した上でrestoreするんだろうけど、ちょっと考えてもメンドクサイ。
じゃあってんで、RDSへssmでアタッチ出来るようにすればいいんだけど、なんかSession Managerでポートを転送するようなドキュメントを作れば出来るぽいけどこれもメンドクサイw
考えてても時間がたつばかりなので、やるかぁってことでdumpして昨日は帰宅したんですが、今後何度かやらないと行けないっぽいのでもっといい方法を考えることにする。
いつもどおり標準出力とsshを組み合わせて実現する。
まずdumpする
これは簡単。pg_dumpは標準出力へ出してくれるのでなにも考えないでOK。ただし、formatをplainにすることを忘れないように。
$ pg_dump -h db_server_name -U postgres --clean --create --format=p --blobs db_name
認証は省略しているけれど、この辺は.pgpassとかサーバ側のpg_hba.confあたりでコントロールする。
restoreする
上記のdumpでtext plainでdumpデータが標準出力へでてくる。これをssh経由でpsqlへ流す。
$ ssh i-xxxxxxxxxxxxxxx 'psql -h rds_endpoint_name --username=admin postgres'
上記のi-xxxxxxxxxxxxってのがRDSへTCP/5432で接続できるEC2インスタンスのID。-hで接続先のRDSエンドポイントを指定。ユーザ名はRDSのスーパーユーザを指定。
認証は例によって.pgpassでスキップさせる。
なので結果こんな感じです。
#!/bin/bash for i in db1 db2 db3 db4 db5 do pg_dump -h db_server \ -U postgres \ --clean \ --create \ --format=p \ --blobs $i | \ ssh i-xxxxxxxxxxxxxxxx \ 'psql \ -h rds_endpoint_name \ --username=admin postgres' done
AmazonSESをPostfixのリレーサーバとして利用する
AmazonSESをPostfixのリレーサーバとして利用する
お題のまま。Amazon EC2インスタンスからのメール送信をAmazon SESへぶん投げる設定。
このあたりが実はややこしかったりするんだけど以下の設定がすんでいることが前提です。
- 特定ドメインメールアドレス(例えば @example.com)からの送信認証がSES上ですんでいること。
- Postfixがインストール済であり、稼働していること。
- sendmailなど他のMTAが稼働していないこと。
- sasl認証パッケージ(cyrus-sasl-plainなど)がインストールされていること。
SESのVPCエンドポイントを作成する
VPCからインタネットGWやNATを経由してSESを利用する方法もあるのですが、使えるのならVPCエンドポイントを利用するのがいいでしょう。
VPCコンソールからエンドポイント。「エンドポイントを作成」をクリック。
名前やSubnetは適当に選んで、セキュリティのインバウンドには送信するEC2にマッチするCIDRアドレス、TCPの25,465,578,2465を設定。
SESのユーザ作成
このあたりは
Amazon SES SMTP 認証情報を取得 - Amazon Simple Email Service
ここの情報を参照。
SESコンソールからAccount dashboardを選択(デフォルトでそこだけど)。中段のSimple Mail Transfer Protocols(SMTP) settingsのところ、Create SMTP credentialsをクリック。
IAMのなんか縮小版みたいな画面がでるので、適当なユーザ名をいれて「作成」をクリック。
作成できたら認証情報がダウンロードできるので、適当なところへダウンロード。
内容はこんな感じのCSVファイル。
>||
IAM User Name,Smtp Username,Smtp Password^
"username",XXXXXXXXXXXXXXX,ZXZFZXCSDFSFGFETrdsgfSDFsda
|
1カラム目がIAMユーザ名でこれは要らない情報。2カラム目がユーザ名、3カラム目がパスワード。
さっき入手したユーザ名とパスワードを設定
まず /etc/postfix/sasl_passwdに上のユーザ名とパスワードを設定する。ファイルがない場合は作成する。
[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPUSERNAME:SMTPPASSWORD
IAMのユーザ名を書いちゃったりする(書いちゃいました)ので注意。FQDNは利用しているリージョンで違うので適宜書き換えてください。
postmapコマンドでdbファイルを作成する
実際にはpostfixはhashした値を読むので以下コマンドでDBファイルを作成する。
$ sudo postmap hash:/etc/postfix/sasl_passwd
上記で出来た /etc/posfix/sasl_passwd.dbファイルのパーミションを変更する。/etc/postfix/sasl_passwdファイルも同時に変更したほうがいいのはあたりまえ。
$ sudo chown root:root /etc/postfix_sasl* $ sudo chmod 0600 /etc/postfix_sasl*
/etc/postfix/main.cfを編集
最近はテキストエディタじゃなくて、postconf -eってコマンドで編集するのね。
$ sudo postconf -e "relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587" \ "smtp_sasl_auth_enable = yes" \ "smtp_sasl_security_options = noanonymous" \ "smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \ "smtp_use_tls = yes" \ "smtp_tls_security_level = encrypt" \ "smtp_tls_note_starttls_offer = yes"
CAファイルの置き場所を設定
AmazonLinuxやRedhatなら以下。
$ sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
Postfixに設定を読み込ませる
$ sudo postfix reload
nginx_ajp_module-masterでコンパイルエラー
nginx_ajp_module-masterでコンパイルエラー
いまどきajpってのも何なんですが。
nginx1.21.6とnginx_ajp_module-masterでmakeするとこんなエラー。
cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs -I src/http -I src/http/modules -I ../nginx_ajp_module-master \ -o objs/addon/nginx_ajp_module-master/ngx_http_ajp.o \ ../nginx_ajp_module-master/ngx_http_ajp.c ../nginx_ajp_module-master/ngx_http_ajp.c: 関数 ‘sc_for_req_get_uri’ 内: ../nginx_ajp_module-master/ngx_http_ajp.c:139:29: エラー: ‘ngx_http_request_t {aka struct ngx_http_request_s}’ has no member named ‘space_in_uri’; did you mean ‘plus_in_uri’? if (r->quoted_uri || r->space_in_uri || r->internal) { ^~~~~~~~~~~~ plus_in_uri make[1]: *** [objs/addon/nginx_ajp_module-master/ngx_http_ajp.o] エラー 1 make[1]: ディレクトリ `/home/murata/nginx/nginx-1.21.6' から出ます make: *** [build] エラー 2
ngx_http_request_s構造体にspace_in_uriってメンバがないぞって言ってる。
むかーしのnginx(1.14あたり)のソースを参照すると確かにある。
/* URI with "%" */ unsigned quoted_uri:1; /* URI with "+" */ unsigned plus_in_uri:1; /* URI with " " */ unsigned space_in_uri:1; unsigned invalid_header:1; unsigned add_uri_to_alias:1; unsigned valid_location:1; unsigned valid_unparsed_uri:1; unsigned uri_changed:1; unsigned uri_changes:4;
同じ構造体を最新(1.21.6)でみるとこんな。
unsigned http_state:4; /* URI with "/." and on Win32 with "//" */ unsigned complex_uri:1; /* URI with "%" */ unsigned quoted_uri:1; /* URI with "+" */ unsigned plus_in_uri:1; /* URI with empty path */ unsigned empty_path_in_uri:1; ||< empty_path_in_uriって名前に変わってるみたいです。 nginx_ajp_module-master/ngx_http_ajp.cを編集してOK。
phpでWarning
phpでWarning
EC2でWeb環境を作成中。phpでなにやらワーニングがでる。
$ php PHP Warning: PHP Startup: Unable to load dynamic library 'oci8' (tried: /usr/lib64/php/modules/oci8 (/usr/lib64/php/modules/oci8: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/oci8.so (/usr/lib64/php/modules/oci8.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: /usr/lib64/php/modules/pdo_oci (/usr/lib64/php/modules/pdo_oci: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/pdo_oci.so (/usr/lib64/php/modules/pdo_oci.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'zip.so' (tried: /usr/lib64/php/modules/zip.so (/usr/lib64/php/modules/zip.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/zip.so.so (/usr/lib64/php/modules/zip.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
$ sudo yum insatll php-pecl-zip.x86_64 php-oci8.x86_64 php-pdo.x86_64
リトライ。zipのワーニングは消えたけど、まだなんかでる。ちょっとエラーメッセージが違うな。
$ php PHP Warning: PHP Startup: Unable to load dynamic library 'oci8' (tried: /usr/lib64/php/modules/oci8 (/usr/lib64/php/modules/oci8: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/oci8.so (libclntsh.so.21.1: cannot open shared object file: No such file or directory)) in Unknown on line 0 PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: /usr/lib64/php/modules/pdo_oci (/usr/lib64/php/modules/pdo_oci: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/pdo_oci.so (libclntsh.so.21.1: cannot open shared object file: No such file or directory)) in Unknown on line 0
libclntshがないっていってる。これはたしかOracleクライアント。
ここからダウンロードしてrpmでインストール。
ワーニングでなくなりました。