private docker registry のはまりどころ(S3連携、SSL)

AWSでprivate docker registryをコンテナで立てた際のハマったポイントをメモ。

ケース

・AWS EC2(Amazon Linux)上にコンテナで実現
・コンテナイメージはdocker registry 2.1
・ボリュームはS3に設定
・SSLはオレオレ証明書で対応
・外部インターネットとの接続は原則ない(クローズド環境)

ハマった点

① docker push/pullで以下のようなエラーとなる

x509: certificate signed by unknown authority

opensslでオレオレ証明書(crtファイル)を作成し、pull/pushするクライアント側に格納するが、/etc/docker/certs.d/配下に格納してしまうと、dockerがOSのroot証明書を参照しなくなり、S3など他のSSL接続ができなくなる。
今回のようにボリュームをS3に指定する場合は特に注意が必要。
crtファイルは[registryのドメイン名].crtとして、/etc/pki/ca-trust/source/anchors配下に格納する。

その後、設定を反映し、dockerを再起動する。

sudo update-ca-trust
sudo service restart docker

これでエラーは解決した。

② docker push/pullでio.timeoutとなる

SSLの設定が解決したところで、クライアントからpush/pullをすると、以下のようなエラーとなる。

tcp XX.XX.XX.XX:443: i/o timeout.

IPアドレスを逆引きしてみると、s3-ap-northeast-1.amazonaws.comと判明。

どうやらクライアントは、push/pushの際、docker registryサーバだけでなく、S3に直接イメージpull/pushのための接続を行っている模様。
つまり、docker registryでボリュームをS3に指定した場合、当然registryを立てたEC2から、ボリュームとして指定したS3バケットへのアクセス権(ポリシーやROLEなど)は必須だが、同時にクライアント側も対象S3バケットへアクセスできる必要がある。
オンプレミスとのハイブリッド環境など、クローズドな環境の場合は特に注意が必要。

スクリーンショット 2017-01-18 20.54.28.png

参考

https://ishiis.net/2017/01/12/docker-distribution-install/

http://dev.classmethod.jp/cloud/docker-registry-recipes/

https://docs.docker.com/registry/deploying/#configure-tls-on-a-registry-server

http://qiita.com/suzukihi724/items/c8135fcfbf74fcbc80d0

続きを読む

EC2(Python3)->BigQuery

前提

・GCPのアカウントが準備できていること
・BigQueryに接続可能なtableが存在すること

実行環境の準備

ec2
-pyenv
-naconda3-4.0.0
-pandas
-httplib2
-google-api-python-client

モジュール追加

sudo su -
pyenv global naconda3-4.0.0
pip install httplib2
pip install google-api-python-client

GoogleCloudSDKの導入(python2.x環境で実行)と認証

pyenv global system
curl https://sdk.cloud.google.com | bash
~/google-cloud-sdk/bin/gcloud auth login

※認証情報は~/.config配下に出力される

ごく少ないレコードのテーブルで実行

import pandas as pd
query = 'SELECT * FROM dataset_name.table_name'
pd.read_gbq(query, 'your_project_ID')

→pd.read_gbqで認証が走るが、EC2が実行元となるため、
 localhostでリスンする認証用URLがうまく受け取れない

Oauth2での認証情報生成

from oauth2client.client import OAuth2WebServerFlow
from oauth2client.file import Storage
flow = OAuth2WebServerFlow(client_id='your_client_id',
                           client_secret='your_client_secret',
                           scope='https://www.googleapis.com/auth/bigquery',
                           redirect_uri='urn:ietf:wg:oauth:2.0:oob')
storage = Storage('bigquery_credentials.dat')
authorize_url = flow.step1_get_authorize_url()
print 'Go to the following link in your browser: ' + authorize_url
code = raw_input('Enter verification code: ')
credentials = flow.step2_exchange(code)
storage.put(credentials)

※your_client_id、your_client_sercretは~/.config配下から

上記処理実行後、カレントディレクトリに「bigquery_credentials.dat」が作成される。
→pandas.read_gbqは上記を認証情報として利用

ごく少ないレコードのテーブルで実行

import pandas as pd
query = 'SELECT * FROM dataset_name.table_name'
pd.read_gbq(query, 'your_project_ID')

参考

https://developers.google.com/api-client-library/python/guide/aaa_oauth
http://stackoverflow.com/questions/37792709/accessing-big-query-from-cloud-datalab-using-pandas

続きを読む

CSR作成からELB(ClassicLoadBalancer)への証明書適用まで

https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_renew.html

  • どこで作っても良い

1.キーペア作成済み

2.秘密鍵作成
鍵作成

# 鍵作成
$ openssl genrsa -des3 -out domain.2016.key 2048 

# パスフレーズ削除
$ openssl rsa -in domain.key -out domain.2016.key-nopass 

3.CSR作成

# CSR作成
$ openssl req -new -key domain.2016.key -out domain.2016.csr


Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:xxxx
Organization Name (eg, company) [Default Company Ltd]:xxxx
Organizational Unit Name (eg, section) []:Secure Server IDs
Common Name (eg, your name or your server's hostname) []:domain
Email Address []:xxxx

ELBに証明書登録

http://dev.classmethod.jp/cloud/aws/aws-beginner-elb-ssl/

https://liginc.co.jp/web/programming/server/164756

スクリーンショット 2016-11-16 13.42.30.png

  • 証明書名

    • ドメイン
  • プライベートキー
    • パスフレーズを削除した秘密鍵
  • パブリックキー証明書
    • 購入した証明書
  • 証明書チェーン
    • 中間証明書

登録できない時

スクリーンショット 2016-11-16 13.45.27.png

CLIで試してみる
(インスタンス全てが通らないと登録できないみたい。)

一覧

aws iam list-server-certificates

削除

aws iam delete-server-certificate –server-certificate-name a

登録~

https://saku.io/use-aws-cli-to-upload-certs-on-elb/

aws iam upload-server-certificate  domain 
  --certificate-body file://domain.cer 
  --private-key file://domain.2016.key-nopass 
  --certificate-chain file://中間証明書.txt

確認

aws iam get-server-certificate –server-certificate-name SSL証明書名

timeoutになる

AWS Certificate Manager

AWS上で証明書を発行・管理できる、AWS Certificate Manager(ACM)が便利。

続きを読む

AWS EC2のメモリ利用率をCloudWatchに追加する

EC2を立ち上げ後、デフォルトではメモリ利用率はCloudWatchに監視追加できません。
そのため、必要なパッケージをインストールし、CloudWatchモニタリング用スクリプトを設置してCronを仕掛ける必要があります。
Cronを実行するとただちCloudWatch側に反映するので比較的簡単です。
※AWSのアクセスキーID、シークレットキーの取得は別途行ってください。

必要なパッケージをインストール

$ sudo yum -y install perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA

CloudWatchモニタリング用スクリプトの格納場所を作成

$ sudo mkdir /usr/local/cloudwatch
$ cd /usr/local/cloudwatch
$ sudo wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
$ sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
$ sudo rm CloudWatchMonitoringScripts-1.2.1.zip

スクリプトの設定

$ cd aws-scripts-mon
$ sudo cp awscreds.template awscreds.conf
$ sudo vim awscreds.conf

「awscreds.conf」に、以下を記載

  • AWSAccessKeyId=[アクセスキーID]
  • AWSSecretKey=[シークレットキー]
    ※アクセスキーID、シークレットキーの取得は別途行ってください。

Cron登録

$ crontab -e

以下をcrontabに登録

*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --from-cron

AWSコンソールからCloudWatchで確認する

AWSコンソールでCloudWatchを選択すると、メトリクスの中に「Linuxシステム」の欄が追加されていることがわかる。
20161207_aws_ec2_memory_metrix.png

「Linuxシステム」-「InstanceId」をドリルダウンすると、「MemoryUtilization」、「MemoryUsed」、「MemoryAvailable」の項目が取れていることがわかる。
これらを組み合わせてグラフを作成し、ダッシュボードに表示できる。
20161213_aws_ec2_memory_5stack.png

まとめ

メモリ監視でアラームを追加したり、ほかにもDisk容量監視も同じ要領で追加できます。

Disk容量監視は以下のcronを追加するだけ

*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --disk-space-util --disk-path=/ --from-cron

参考にしたサイト

AWS EC2でメモリ利用率をCloud Watchで監視する
AWS EC2でメモリ利用率とディスク容量をCloudWatchで監視する

上記のサイトだと、パッケージperl-Digest-SHAが入っていないエラーが発生したので下記サイトを参考にエラーを取り除いた。
RedmineとGitを連携させる(認証統合)

続きを読む