CloudFrontでリファラがおちる

CloudFrontでリファラがおちる

CloudFrontを通したHTTPリクエストで、リクエストヘッダからrefererが抜け落ちているとのレポート。
バックエンド側のHTTPログをみるとたしかにリファラ部分が "-"になってる。
なぜじゃと調べることしばし。
ディストリビューションの「ビヘイビア」がおかしいことに気づきました。
修正するには以下。

  1. ディストリビューションを選択
  2. ビヘイビアタブをクリック
  3. リクエストに当該するパスパターンを選択して編集をクリック
  4. 下の方「キャッシュキーとオリジンリクエスト」のところで "Cache policy and origin request policy" を選択

Legacy cache setting ならヘッダを指定してあげればいいみたいです。

yumでインストールしたApacheへのモジュール追加

yumでインストールしたApacheへのモジュール追加

いままであんまりパッケージのApacheってつかったことなくて、モジュールを追加するのってどうやるんだって調べることしばし。
やっぱりyumでインストールするみたいですね。

# yum install mod_ldap

EC2インスタンスを再起動すると/etc/resolv.confが元に戻る

EC2インスタンスを再起動すると/etc/resolv.confが元に戻る

ec2インスタンスの/etc/resolv.confの設定をして再起動すると、なんだかデフォルトに値に戻る。
なんでや、と調べることしばしどうもDHCPの設定が有効になっていることが原因みたい。

/etc/sysconfig/network-scripts/ifcfg-eth0を編集

このファイルの以下の行を変更。

PEERDNS=yes

PEERDNS=no

に変更する。

データセンタのPostgreSQLをAmazonRDSへコピーする

データセンタのPostgreSQLをAmazonRDSへコピーする

データセンタのLinux上で動作しているPostgreSQLをAmazonRDSへコピーしたい。

環境としてはこんな。
f:id:rougeref:20220223133342j:plain

作業端末から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を設定。

f:id:rougeref:20220222135935p:plain

SESのユーザ作成

このあたりは
Amazon SES SMTP 認証情報を取得 - Amazon Simple Email Service
ここの情報を参照。

SESコンソールからAccount dashboardを選択(デフォルトでそこだけど)。中段のSimple Mail Transfer Protocols(SMTP) settingsのところ、Create SMTP credentialsをクリック。
f:id:rougeref:20220222140524p:plain

IAMのなんか縮小版みたいな画面がでるので、適当なユーザ名をいれて「作成」をクリック。
f:id:rougeref:20220222141000p:plain

作成できたら認証情報がダウンロードできるので、適当なところへダウンロード。
内容はこんな感じの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"

/etc/posftix/master.cfをチェック

以下のエントリがないことを確認。

-o smtp_fallback_relay=

あったらコメントアウトする。

CAファイルの置き場所を設定

AmazonLinuxやRedhatなら以下。

$ sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'

ubuntuMacOSだとファイル名が違うみたいです。

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

はいはい、phpのモジュールがたりんのね。yumでいれる。

$ 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でインストール。

ワーニングでなくなりました。