Route53にドメインをコマンドラインで登録する【cloudpack 大阪 BLOG】
Route53にドメインを大量に登録する必要があったので、cliでのやり方を調べてみるとインプットにjsonファイルが必要なことがわかりました。ちょっと面倒だったので別の方法を探してみるとcli53というツールを見つけました。使い勝手はかなりいい感じだったので、インストール方法と使い方を紹介したいと思います。
インストール方法
ダウンロード
以下のリンクから自分の環境に応じて、パッケージをダウンロードしてください。
今回はMac版(cli53-mac-amd64)をダウンロードしました。
Release 0.7.0 · barnybug/cli53 · GitHub
インストール方
リネームして実行権を付与します。
# sudo mv cli53-mac-amd64 /usr/local/bin/cli53 # sudo chmod +x /usr/local/bin/cli53
使い方
事前に~/.aws/credentialsにシークレットキーとアクセスキーを設定しておいてください。
もしくは実行時に以下のように変数にセットしてください
aws_access_key_id = AKID1234567890 aws_secret_access_key = MY-SECRET-KEY
hosted zoneの作成
cli53 create example.com
Aレコード
Zone Apex
cli53 rrcreate example.com '@ 300 A 192.168.1.2'
サブドメインがwww
cli53 rrcreate example.com 'www 60 A 192.168.0.1'
CNAMEレコード
cli53 rrcreate example.com 'mail CNAME ghs.googlehosted.com.'
MXレコード
cli53 rrcreate example.com '@ MX "10 192.168.0.1" "20 192.168.0.2"'
AWS LambdaでGmail APIの呼び出し 第2回【cloudpack 大阪 BLOG】
前回でGmailAPIにアクセスする準備は整いましたので、引き続きLambdaでアクセスしてみたいと思います。
2.Lambdaの設定
① Lambda用プロジェクトの作成
プロジェクトのディレクトリを作成します。また、GmailAPIにアクセス用のライブラリなども利用するためvirtualenvで環境を分けておきます。
mkdir gmailapi_for_lambda cd gmailapi_for_lambda/ virtualenv .venv
② 秘密鍵をp12からpemに変換
ダウンロードしたp12形式のファイルをpem形式に変換
openssl pkcs12 -in xxxxxxx.p12 -nodes -nocerts > privatekey.pem
③ Lambdaの作成
以下の4つのファイルを準備する。
gmailapi_for_lambda ├── gmail_access.py ・・・ lambda関数本体 ├── lambda.json ・・・ labda-uploader用設定ファイル ├── privatekey.pem ・・・ APIアクセス証明書 └── requirements.txt ・・・ ライブラリリスト
◆gmail_access.py
GmailにアクセスするLambda関数本体となります。
####################################################################################### # This is a sample to get the message list from Gmail ####################################################################################### import httplib2 import imaplib,email,email.Header import base64 from apiclient.discovery import build from oauth2client.file import Storage from oauth2client.client import SignedJwtAssertionCredentials import pprint def lambda_handler(event, context): try: main() except Exception: traceback.print_exc() sys.stderr.flush() sys.exit(1) def main(): pp = pprint.PrettyPrinter(indent=4) SERVICE_ACCOUNT_ID="your service account id" ← サービスアカウントIDをセット KEY_SECRET="your secret key" ← 秘密鍵のパスワード GMAIL_ACCOUNT="your gmail account" ← gmailのアカウント f = open("privatekey.pem","rb") key = f.read() f.close() credentials = SignedJwtAssertionCredentials( SERVICE_ACCOUNT_ID, key, scope="https://www.googleapis.com/auth/gmail.readonly", sub=GMAIL_ACCOUNT) http = httplib2.Http() http = credentials.authorize(http) service = build("gmail", "v1", http=http) message_list = service.users().messages().list(userId='me', #labelIds=label_ids, #pageToken=page_token, maxResults=10, q='is:unread' ).execute() for message in message_list['messages']: message_detail = service.users().messages().get(userId='me', id=message['id'],format='metadata').execute() for element in message_detail['payload']['headers']: if element['name'] == 'Subject': print element['value'] if __name__ == '__main__': main()
◆lambda.json
lambda-uploder用の設定ファイルとなります。名称は任意です。roleは環境に合わせて変更してください。
{ "name": "GmailTest", "description": "GmailTest", "region": "ap-northeast-1", "handler": "gmail_access.lambda_handler", "role": "arn:aws:iam::000000000000:role/lambda_basic_execution", "timeout": 300, "memory": 128 }
◆requirements.txt
利用するpythonのライブラリを記載します。Lambdaへのアップロード時にはこのファイルを参照してライブラリがアップロードファイルへ固められます。
pyCrypto google-api-python-client
virtualenv環境をactive化する
source .py27/bin/activate
pythonライブラリのインストール
pip install -r requirements.txt
lambda-uploaderのインストール
pip install lambda-uploader
lambda-uploaderを実行
事前にaws configrueでアップロード先のアカウントのアクセスキー及びシークレットキーをセットしておく
lambda-uploader
AWS LambdaでGmail APIの呼び出し 第1回【cloudpack 大阪 BLOG】
AWS LambdaからGmailAPIを呼び出したいと思い方法を調べてみました。当初はGmailAPIにアクセスするためのQuickstartが用意されていたため簡単にできるかと思っていました。が、サンプルがOAuth認証のみとなっていました。OAuthではプログラム実行時に手動で認証になるためLambdaではサービスアカウントを使用する必要があります。このあたりの使い方がよくわからずがっつりハマりました。また、Lambdaでもしっかり躓きなかなか大変でしたが、何とかAPIを呼び出すところまで漕ぎ着けたので手順をまとめておきたいと思います。今回は長くなりそうなので2回に分けたいと思います。
手順
1.GmailAPIの設定(第1回)
① プロジェクトの作成
② APIの有効化
③ サービスアカウントの作成
2.Lambdaの設定(第2回)
① Lambda用プロジェクトの作成
② 秘密鍵をp12からpemに変換
③ Lambdaの作成
④ 動作確認
開発環境
Amazon Linux AMI release 2015.09
Python v2.7.10
google-api-python-client v1.4.2
pycrypto v2.6.1
lambda-uploader v0.5.0
1.GmailAPIの設定
① プロジェクトの作成
前提としてGmailの2段階認証を有効にしておいてください。まずはGoogle Developer Consoleにアクセスします。
HOME画面にアクセスし、「プロジェクトの作成」を選択。初めての場合はプロジェクトの作成画面になるかもしれません。
プロジェクト名に任意の名前を入力し、作成をクリック。
③ サービスアカウントの作成
Lambdaからアクセスするためのアカウントを作成します。サーバからアクセスする場合はOAuthクライアントIDでも可能ですが、認証が必要となるためサービスアカウントを作成します。左ペインの認証情報を選択し、新しい認証情報クリック。
サービスアカウントキーを選択。
任意の名前を入力します。キーのタイプP12を選択し作成をクリック。
鍵が自動的にダウンロードされますので保管しておいてください。またパスワードも控えておいてください。
余談ですが、たまたまSafariでこのページを開いていたのですが自動でダウンロードされませんでした。
サービスアカウントの管理をクリック
GmailAPIにアクセスする際はこのメールアドレス(サービスアカウントID)とダウンロードした鍵を使用して認証を行います。
これで準備が整いましたので、次回はLambdaでGmailアクセスを行いたいと思います。
AWS IOTでDynamoDBへ登録する【cloudpack 大阪 BLOG】
仕事でAWS IOTを使って簡単なデモを作成しました。センサーから送信されたデータは、IOTからDynamoDBへ直接連携できる機能が用意されていたため、DynamoDBへ登録することにしました。今回はその手順を残しておきます。
手順(概要)
1.テーブル作成
2. AWS IOTの設定
3. 動作確認
2.AWS IOTの設定
①thingの作成
AWS IOT上で管理するデバイスの名前を作成します。
②ruleの作成
IOTで受け取ったデータをどのように処理するかのルールを作成します。
Create a ruleをクリック
③証明書の取得
認証用の証明書を取得します
秘密鍵、証明書等をダウンロードします。
また使いたいSDKを選択し、「Confirm & start connect」を選択します。
以下のページが表示されSDKのダウンロードができます。
また、下記ページからroot証明書をダウンロードします。
https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem
3. 動作確認
動作確認はnodeで1回だけpublishするサンプルを作成しました。テストだけならaws cliでも確認可能です。
aws-iot-device-sdk-js/examples以下に適当な名前で下記プログラムを作成します。
また同じディレクトリにcertsディレクトリを作成し上記で取得した証明書を格納しておきます
const deviceModule = require('..').device; const cmdLineProcess = require('./lib/cmdline'); const device = deviceModule({ keyPath: './certs/private.pem.key', certPath: './certs/certificate.pem.crt', caPath: './certs/root-CA.crt', clientId: '1', region: 'ap-northeast-1', reconnectPeriod:10 }); var thingName = 'iot_test' device.subscribe(thingName); var put_data = {}; var data = new Array(); // データ送信 var now = new Date(); var yyyymmdd = now.getFullYear()+ ( "0"+( now.getMonth()+1 ) ).slice(-2)+ ( "0"+now.getDate() ).slice(-2); var hhmmss = ("0" + now.getHours()).slice(-2) + ("0" + now.getMinutes()).slice(-2) + ("0" + now.getSeconds()).slice(-2) + ("00" + now.getMilliseconds()).slice(-3); put_data = { date: yyyymmdd, time : hhmmss, value :Math.floor( Math.random() * 11 ) }; device.publish(thingName, JSON.stringify(put_data)); console.log( JSON.stringify(put_data)); console.log( 'publish');
次のコマンドで実行します。
node put_data.js
publishしたデータ送信データが登録されましたね。
今回初めてDynamoDBを使ったのでよく分からず、IOTの設定のところでつまづきました。
また、ルール作成のところでPayload fieldにDynamoに登録したいフィールドを入力しましたが、
全項目が登録されてしまい特定のフィールドだけ選択して登録ということが出来ませんでした。ここはもう少し調べてみたいと思います。
VimでPythonのコード補完設定【cloudpack 大阪 BLOG】
最近はAWSのLambdaなどの開発でPythonを使うことが増えてきましたが、まだまだ慣れていないこともあり、ちょっとしたコードを書くにも関数名がわからないので都度ネットで調べないといけないのがすごくストレスでした。
開発環境としてはLinux上のVimで開発しているため、Vim上で動作するPluginがないか調べたところ「jedi-vim」というよさそうなpluginがあったため導入してみました。まだあまり使い込んでいませんが、コード補完だけでなく定義元への移動やPydocの閲覧もでき動作も軽いので結構気に入りました。
今回はjedi-vimの導入方法について紹介したいと思います。
導入手順
1.Neobundleのインストール
2.jedi-vimのインストール
3. 動作確認
Neobundleのインストール
以下のコマンドを実行
mkdir -p ~/.vim/bundle git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
.vimrcに以下の設定を追加
if 0 | endif if has('vim_starting') if &compatible set nocompatible " Be iMproved endif " Required: set runtimepath+=~/.vim/bundle/neobundle.vim/ endif " Required: call neobundle#begin(expand('~/.vim/bundle/')) " Let NeoBundle manage NeoBundle " Required: NeoBundleFetch 'Shougo/neobundle.vim' " My Bundles here: " Refer to |:NeoBundle-examples|. " Note: You don't set neobundle setting in .gvimrc! call neobundle#end() " Required: filetype plugin indent on " If there are uninstalled bundles found on startup, " this will conveniently prompt you to install them. NeoBundleCheck
jedi-vimのインストール
以下のコマンドを実行
cd ~/.vim/bundle/
git clone --recursive https://github.com/davidhalter/jedi-vim.git
.vimrcに以下の設定を追加
" Jedi for python NeoBundleLazy "davidhalter/jedi-vim", { \ "autoload": { "filetypes": [ "python", "python3", "djangohtml"] }} if ! empty(neobundle#get("jedi-vim")) let g:jedi#auto_initialization = 1 let g:jedi#auto_vim_configuration = 1 nnoremap [jedi] <Nop> xnoremap [jedi] <Nop> nmap <Leader>j [jedi] xmap <Leader>j [jedi] let g:jedi#completions_command = "<C-Space>" # 補完キーの設定この場合はCtrl+Space let g:jedi#goto_assignments_command = "<C-g>" # 変数の宣言場所へジャンプ(Ctrl + g) let g:jedi#goto_definitions_command = "<C-d>" # クラス、関数定義にジャンプ(Gtrl + d) let g:jedi#documentation_command = "<C-k>" # Pydocを表示(Ctrl + k) let g:jedi#rename_command = "[jedi]r" let g:jedi#usages_command = "[jedi]n" let g:jedi#popup_select_first = 0 let g:jedi#popup_on_dot = 0 autocmd FileType python setlocal completeopt-=preview " for w/ neocomplete if ! empty(neobundle#get("neocomplete.vim")) autocmd FileType python setlocal omnifunc=jedi#completions let g:jedi#completions_enabled = 0 let g:jedi#auto_vim_configuration = 0 let g:neocomplete#force_omni_input_patterns.python = \ '\%([^. \t]\.\|^\s*@\|^\s*from\s.\+import \|^\s*from \|^\s*import \)\w*' endif endif
chrootの設定でハマった話【cloudpack 大阪 BLOG】
chrootの設定でかなりハマったので、今回はその内容をまとめたいと思います。
実現したいこと
sftp_userの接続時のホームディレクトリを「/home/sftp_user/home_dir」に制限したい。
意図は、bash_profile、bash_history、.sshなどをsftp接続ユーザーに見せたくないため
設定方法
ユーザー追加
useradd sftp_user passwd sftp_user
/etc/ssh/sshd_configの設定変更
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftp_user
ChrootDirectory /home/sftp_user/home_dir
ForceCommand internal-sftp
PasswordAuthentication yes
sshd再起動
/usr/sbin/sshd -t ← 構文チェック service sshd restart
sshdサービス再起動は十分注意してください。再起動が失敗した場合、新たにssh接続ができなくなります。
クラウドサービスのように直接接続する手段がない場合に対応するときは、別でもう一つssh接続をしておくなど慎重に対応してください。
今回はAWSでの対応のため、起動失敗のままセッションを切ってしまうと接続できなくなってしまい、リカバリ対応がかなり大変になることが想定されました。
ディレクトリの設定
chown root:root /home/sftp_user/home_dir ←必須 chmod 755 /home/sftp_user/home_dir ←必須 mkdir /home/sftp_user/home_dir/data chmod 755 /home/sftp_user/home_dir/data
※「/home/sftp_user/home_dir/」にはsftp_userの書き込み権限がないため、書き込み可能なディレクトリを用意しておく必要があります。
接続確認
sftp sftp_user@IP_ADDR
でパスワードを入力して接続OK
これで対応完了!
としたかったのですが・・・
接続は鍵認証にしたかったようなので、接続用の鍵を作成し設定しました。
いざ接続確認してみるものの、Connection Refuse・・・
再度ユーザー作成し、sshで鍵認証ができることを確認してから上記対応を行うも接続出来ない状況でした。
/var/log/secureを確認しても芳しい情報は得られずでなかなか解決ができませんでした。
で、もう一度よく設定を見直すと今回chrootの設定先は「/home/sftp_user/home_dir」となります
そのため「/home/sftp_user」はroot権限に設定しているため、ssh接続時に鍵の参照ができてないため接続エラーとなっていることに気が付きました。
ということで上記のディレクトリ構成のままで鍵認証ができないことが分かったので、制限用のディレクトリは別途「/var/sftp/sftp_user」などにすることで解決しました。