empty_gif

nginxにおいて表題のディレクティブに関して。

■ 環境

  • Nginx 1.12.2
  • Amazon Linux

■ empty_gif

empty_gif“というディレクティブがあるようだ。1×1ピクセルのgifを返してくれるらしい。ELB配下のAmazonLinuxにおいて、healthcheckに使用してみている。

location = /healthcheck.html {
    empty_gif;
    access_log off;
    break;
}

上記を”server“ディレクティブ配下に設定している。”location“ディレクティブなのでそこしかないが…。アクセスログにも出力させないようにしてしまった。これで少し幸せになれた。

以上。

Chrony on Amazon Linux

表題の通り。先日の”Amazon Time Sync Service“の続き。

■ 環境

  • Chrony 3.2
  • Amazon Linux
  • AWS EC2

■ Amazon Time Sync Service

先日は”Chrony“をUbuntuで入れた。今回はAmazonLinuxでやってみる。

$ ps -ef | grep ntp
ntp       2571     1  0 Nov18 ?        00:00:01 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
$

`ntp`が動いているのでこれを停止する。

$ sudo service ntpd stop

chronyをインストール。

$ sudo yum install chrony
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                                                       | 2.1 kB  00:00:00
amzn-updates                                                                                                    | 2.5 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package chrony.x86_64 0:3.2-1.22.amzn1 will be installed
--> Processing Dependency: libseccomp.so.2()(64bit) for package: chrony-3.2-1.22.amzn1.x86_64
--> Running transaction check
---> Package libseccomp.x86_64 0:2.3.1-2.4.amzn1 will be installed
--> Processing Conflict: chrony-3.2-1.22.amzn1.x86_64 conflicts ntp
--> Finished Dependency Resolution
Error: chrony conflicts with ntp-4.2.6p5-44.34.amzn1.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
$

`ntp`とconflictしていると怒られた。というわけで`ntp`の削除を実施してから再度実行する。

$ sudo yum remove ntp
 :
$ sudo yum install chrony

あとは前回と同じように設定を入れ込む。

server 169.254.169.123 prefer iburst

設定ファイルはUbuntuの時とは違い、下記にあった。

/etc/chrony.conf

またサービス名もUbuntuの時は”chrony“であったが、こちらでは”chronyd“であった。ansibleのplaybookにする時等はいつものように注意が必要だ。

$ sudo service chronyd start

以上。

■ 関連

Amazon Time Sync Service

S3デフォルト暗号化

表題について。

■ 環境

  • AWS S3
  • awscli 1.11.190
  • Mac OSX El Capitan

■ デフォルト暗号化

S3上でデフォルト暗号化がされるようにバケットの設定をすることができる。2017/11頃からであったと記憶している。ManagementConsoleから下記で変更することが可能である。

バケット > プロパティ > デフォルト暗号化

とりあえず”AES-256“を選択した。

`aws`コマンドでオブジェクトをput/getしても特に何もしなくても問題無い。

このManagementConsoleで”デフォルト暗号化”を設定するが、awscliでできるのか?を見てみた。

■ s3

$ aws s3 mb help

マニュアルを見ても、特にオプションと思わしきものはない。”region“を指定することができるくらいのようである。

■ s3api

$ aws s3api create-bucket help

上記では”–create-bucket-configuration“オプションがあるので指定できるのかと思ったのだが、”LocationConstraint“しか指定できないように読める…。その他は権限周りのオプションのようだ。

デフォルト暗号化の設定は後からでも変更できるな、と思い他のサブコマンドも確認してみる。

get-bucket-encryption

$ aws s3api get-bucket-encryption --bucket withsin
{
    "ServerSideEncryptionConfiguration": {
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "AES256"
                }
            }
        ]
    }
}
$

暗号化しているか?は”get-bucket-encryption“サブコマンドで取得できる。ちなみにデフォルト暗号化をしていないバケットに対して同様のコマンドを実行すると下記のようになるようだ。

$ aws s3api get-bucket-encryption --bucket withsin2

An error occurred (ServerSideEncryptionConfigurationNotFoundError) when calling the GetBucketEncryption operation: The server side encryption configuration was not found
$

put-bucket-encryption

$ aws s3api put-bucket-encryption help

どうやらこのサブコマンドで設定することが可能なようである。試してみよう。

$ aws s3api put-bucket-encryption --bucket withsin2 --server-side-encryption-configuration '{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      }
    }
  ]
}'
$
$ aws s3api get-bucket-encryption --bucket withsin2
{
    "ServerSideEncryptionConfiguration": {
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "AES256"
                }
            }
        ]
    }
}
$

上記のように設定ができたようである。

以上。

Amazon Time Sync Service

表題を使うように設定を変更する。re:inventで発表された表題を実際に使いたい。

■ 環境

  • Ubuntu 16.04
  • AWS EC2

■ chrony

現状では`ntpd`が動いているので止める。

$ ps -ef | grep ntp
ntp      19577     1  0 Sep22 ?        00:03:01 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 112:116
$
$ sudo systemctl stop ntp
$
$ ps -ef | grep ntp
$

`ntp`のパッケージ削除は後回しにするとして、`chrony`をインストールする。

$ sudo apt-cache search chrony
  :
chrony - Versatile implementation of the Network Time Protocol
  :
$
$ sudo apt-get install chrony

インストールしたら既に起動していた。

$ sudo systemctl status chrony
● chrony.service - LSB: Controls chronyd NTP time daemon
   Loaded: loaded (/etc/init.d/chrony; bad; vendor preset: enabled)
   Active: active (running) since Mon 2017-12-04 19:05:19 JST; 34s ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/chrony.service
           └─3038 /usr/sbin/chronyd

Dec 04 19:05:17 host001 systemd[1]: Starting LSB: Controls chronyd NTP time daemon...
Dec 04 19:05:17 host001 chronyd[3038]: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP -DEBUG +ASYNCDNS
Dec 04 19:05:17 host001 chronyd[3038]: Initial frequency 18.920 ppm
Dec 04 19:05:19 host001 chronyd[3038]: Source XXX.XXX.XXX.XX1 online
Dec 04 19:05:19 host001 chronyd[3038]: Source XXX.XXX.XXX.XX2 online
Dec 04 19:05:19 host001 chronyd[3038]: Source XXX.XXX.XXX.XX3 online
Dec 04 19:05:19 host001 chronyd[3038]: Source XXX.XXX.XXX.XX4 online
Dec 04 19:05:19 host001 chrony[3017]: chronyd is running and online.
Dec 04 19:05:19 host001 systemd[1]: Started LSB: Controls chronyd NTP time daemon.
Dec 04 19:05:23 host001 chronyd[3038]: Selected source XXX.XXX.XXX.XX4

接続先を確認する。

$ sudo chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ xxxxxxxxxxxxxxxxxxxx          2   6    77    92  +1700us[+1398us] +/-   31ms
^* ec2-XX-XX-X-XX.ap-northea     2   6   177    28  -1129us[-1423us] +/-   21ms
^- zzzzzzzzzzzz                  2   6   177    27   -363us[ -363us] +/-  162ms
^- aaaaaaaaaaaaaaa               2   6   177    27  -3461us[-3461us] +/-  106ms

ここで繋がった先が2つ目のようなのだが、EC2のどこかのIPのようである。これではちょいと問題がありそうなのでマニュアルを確認。

ネットワークタイムプロトコル (NTP) の構成
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html#configure_ntp

日本語の方にはまだないようなので英語版で確認する。

Configuring the Amazon Time Sync Service
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html#configure-amazon-time-service

これを参考に、下記を`/etc/chrony/chrony.conf`に追記した。

server 169.254.169.123 prefer iburst

chronyを再起動し再度確認する。

$ sudo systemctl restart chrony
$
$ sudo chronyc sources
210 Number of sources = 5
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 169.254.169.123               3   7   377   126  +1540ns[+2000ns] +/- 1343us
^- ec2-XX-XX-X-XX.ap-northea     2   7   377   127   -336us[ -336us] +/-   19ms
^- aaaaaaaaaaaaaaaaaaaaaaaaa     2   7   377   127    -38us[  -38us] +/-   28ms
^- bbbbbbbbbbbbbbb               2   7   377   127   -245us[ -245us] +/-  113ms
^- ccccccccccccccccccccc         2   7   377    57  -2171us[-2171us] +/-   91ms
$

us“が”ns”に、”ms“が”us“になって凄く速くなったようだ。

これらの設定を他にもVPCで動いている各ホストにも入れ込むことにする。

ちなみにntpは後で削除しようと思っていたが、chronyをインストールする時に同時に削除されていた。

以上。

■ 関連

Chrony on Amazon Linux

AWS PriceList API

表題の件について。

■ 環境

  • awscli 1.11.190
  • Mac OSX El Capitan

■ AWS Price List API

`awscli`から使えるとのことなので試してみたいと思いやってみた。`help`を見てみると下記のサブコマンドがあるようだった。

  • describe-services
  • get-attribute-values
  • get-products

とりあえず`describe-services`を試す。

$ aws pricing describe-services

Could not connect to the endpoint URL: "https://api.pricing.ap-northeast-1.amazonaws.com/"
$

region“をデフォルト設定で東京にしているのでバージニアとかにしなければいけないのかな…と思い確認してみた。

http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/using-pelong.html

上記のURLによるとエンドポイントは下記2つがある様子。

  • us-east-1
  • ap-south-1

というわけでなんとなく近そうな”ap-south-1“を使用する。

$ aws --region ap-south-1 pricing describe-services

An error occurred (AccessDeniedException) when calling the DescribeServices operation: User: arn:aws:iam::XXXXXXXXXXXX:user/withsin is not authorized to perform: pricing:DescribeServices
$

普段使用しているAccessKeyには権限が無いようだ。ManagementConsoleのIAM権限を追加した。とりあえずFull権限。

AWSPriceListServiceFullAccess

権限を追加後に再度実行してみたところ取得できた。

$ aws --region ap-south-1 pricing describe-services
{
    "Services": [
        {
            "ServiceCode": "AWSBudgets",
            "AttributeNames": [
                "productFamily",
  :

他のコマンドも試してみよう。実際の値を取得するには”get-products“だろうか…と適当にやってみた。

$ aws --region ap-south-1 pricing get-products

An error occurred (InvalidParameterException) when calling the GetProducts operation: Input Parameters are invalid. serviceCode cannot be null or empty
$

serviceCode“を指定する必要があるらしい。これは`describe-services`で取得できるのであろうと再度確認し実行する。

$ aws --region ap-south-1 pricing get-products --service-code awswaf
{
    "FormatVersion": "aws_v1",
    "PriceList": [
        "{\"product\":{\"productFamily\":\"Web Application Firewall\",\"attributes\":{\"servicecode\":\"awswaf\",\"groupDescription\":\"Number of Rules added per Web Access Control Lists\",\"usagetype\":\"Rule\",\"locationType\":\"AWS Edge Location\",\"location\":\"Any\",\"operation\":\"\",\"group\":\"Rule\"},\"sku\":\"7G4GAKZPYS82NXZT\"},\"serviceCode\":\"awswaf\",\"terms\":{\"OnDemand\":{\"7G4GAKZPYS82NXZT.JRTCKXETXF\":{\"priceDimensions\":{\"7G4GAKZPYS82NXZT.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"month\",\"endRange\":\"Inf\",\"description\":\"Price per Rule\",\"appliesTo\":[],\"rateCode\":\"7G4GAKZPYS82NXZT.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"1.0000000000\"}}},\"sku\":\"7G4GAKZPYS82NXZT\",\"effectiveDate\":\"2017-05-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20170526185723\",\"publicationDate\":\"2017-05-26T18:57:23Z\"}",
  :

取得できた。が、ここまで来て気がついた。これは料金表を得られるだけなのか。自身への請求情報じゃないのか、と。

当初イメージしていたものと違っていたのでここまでにしておく。

以上。