- 投稿日:2020-07-03T19:27:49+09:00
【JavaScript 】Node.jsとは
はじめに
Node.jsとはサーバーサイドのjavascriptのプラットフォーム(実行環境)である。
javascriptは本来クライアントサイドで動作するプログラミング言語だが、Node.jsを使用することでサーバーサイドでもjavascriptが利用できるようになる。公式サイト、またはOSのパッケージ管理ツールを使用してインストールすることでNode.jsが使用できる。
・公式サイト
・色々なパッケージ管理ツールでのインストールクライアントサイドとサーバーサイド
? WEBページをブラウザで閲覧する場合の仕組み
1. ブラウザ(クライアント)でURLを指定、サーバーにリクエスト 2. リクエストを受けたサーバーはページを表示するために 必要なhtmlやそれに関連するCSSやjavascriptをブラウザ(クライアント)に返す 3. クライアント側でそれらを受け取ることでWEBページが閲覧できるようになるクライアントサイド
クライアントサイドの言語とは、クライアント(WEB上であればブラウザのこと)からサーバーにリクエストして得られた結果をブラウザで処理(表示)する際に使われる言語のこと。
javascriptがクライアントサイドの言語として挙げられる。サーバーサイド
サーバーサイドの言語とは、クライアントに結果を渡すためにサーバー内で処理を行う言語のこと。
PHP、Ruby、Pythonなどの言語がサーバーサイドで使用される。npm
npmとはNode.jsのパッケージを管理するツールで、Node.jsをインストールすることで自動的に使えるようになる。
ここでいうパッケージとは、あらかじめ用意されているNode.jsの便利な機能をまとめたもののこと。
npmで様々なパッケージのインストールやアップデートをコマンドラインから行うことができる。
npmでインストールされたパッケージはnode_modules
ディレクトリにインストールされ、package.json
ファイルで管理ができる。npmのインストールの種類
npmでパッケージをインストールするには
グローバルインストール
とローカルインストール
の2種類の方法がある。グローバルインストール
npmをインストールした場所にパッケージがインストールされる。全てのプロジェクト(フォルダ)でインストールしたパッケージが使用できるようになる。↓下記コマンドを打ち込むことでグローバルにインストール
npm install -g パッケージ名ローカルインストール
任意のプロジェクト(フォルダ)内にだけパーケージをインストールする。インストールしたプロジェクト内でしかパッケージが使用できない。↓下記コマンドを打ち込むことでローカルにインストール
npm install パッケージ名npm コマンド色々
npm install は npm i と省略して記述することもできる * 作成したものを動かすために必要なパッケージをインストール (package.json の dependenciesに追加される) npm i -S * 開発に必要なパッケージをインストール (package.json の devDependenciesに追加される) npm i -D * パッケージのインストールリスト npm list * パッケージをアンインストール npm rm * node_modulesフォルダを削除 rm -rf node_modules
- 投稿日:2020-07-03T14:48:29+09:00
CodeCommitにcommit/pushしたらLambda経由でSlackにcommentつき通知を飛ばす
AWS CodeCommit上で管理しているリポジトリに、誰かがcommit/pushしたらSlackで通知を受け取りたいと思って試行錯誤したときのメモになります。Lamda関数はNode.jsで記述しています。
スクリーンショット
※ アイコンとCodeCommitの太字はSlack Incomming Webhookのカスタマイズで変更しています。
前置き
- CodeCommitやLamda、Slackの細かい話は書きません。
- Lamda関数のNode.jsのサンプルコードや注意点だけを書きます。
- 以下はすべてAWS Console上からの操作です。
処理の流れ
CodeCommit → トリガー → Lambda → Slack Incomming WebhookのURLにPOST → Slackからスマホアプリ等に通知が飛ぶ
Lamda関数
適当な名前でLamda関数を作成します。以下のサンプルコードをindex.jsに上書きします。
options
のIncomming WebhookのURLと、中程にあるSlack上に表示するメッセージのBlock Kitテンプレートはお好みに合わせて修正します。codeCommitToSlackWebhookconst AWS = require('aws-sdk'); const codecommit = new AWS.CodeCommit({ region: 'ap-northeast-1' }); const https = require('https'); //const util = require("util"); const options = { hostname: 'hooks.slack.com', path: '/services/*******/*******/*******', method: 'POST', headers: { "Accept" : "application/json", "Content-Type" : "application/json; charset=UTF-8" } }; exports.handler = function(event, context) { let repository = event.Records[0].eventSourceARN.split(":")[5]; let references = event.Records[0].codecommit.references; let funcArr = references.map((x) => { return new Promise((resolve,reject) => { let params = { commitId: x.commit, repositoryName: repository }; codecommit.getCommit(params, function(err, data) { if (err) reject(err); else resolve({params:params,data:data}); }); }); }); Promise.all(funcArr) .then((values) => { //console.log(util.inspect({ // values:values //},{colors:true, depth: null})); return new Promise((resolve,reject) => { let blocks = []; blocks.push({ type: 'section', text: { type: 'mrkdwn', text: `new commit pushed to \`${references[0].ref}\`\n\n*Repository:* "${repository}"`, } }); let v = values.map((x) => { let tmp = new Date(x.data.commit.committer.date.split(' ')[0]*1000); tmp = `${tmp.getFullYear()}/${('0'+(tmp.getMonth()+1)).slice(-2)}/${('0'+tmp.getDate()).slice(-2)} ${('0'+tmp.getHours()).slice(-2)}:${('0'+tmp.getMinutes()).slice(-2)}:${('0'+tmp.getSeconds()).slice(-2)}`; return { type: 'section', fields: [ { type: 'mrkdwn', text: '*CommitId:*\n'+x.params.commitId }, { type: 'mrkdwn', text: '*Comment:*\n'+x.data.commit.message }, { type: 'mrkdwn', text: '*Committer:*\n'+x.data.commit.committer.name }, { type: 'mrkdwn', text: '*When:*\n'+tmp } ] }; }); values = {blocks:blocks.concat(v)}; resolve(values); }); }).then((value) => { //console.log(util.inspect({ // value:value //},{colors:true, depth: null})); let req = https.request(options, (res) => { let body = ''; //console.log('statusCode: '+res.statusCode); res.setEncoding('utf8'); res.on('data', (chunk) => { body += chunk; }); res.on('end',() => { //console.log({body:body}); context.done(null,body); }); }); req.on('error',(e) => { //console.log({e:e}); context.fail(e); }); req.write(JSON.stringify(value)); req.end(); }).catch((err) => { //console.log({err:err}); context.fail(err); }); };Lambdaのアクセス権限
- Lambda アクセス権 → 実行ロール → IAMロールの設定が別ウィンドウで開く
- 「ポリシーをアタッチします」で
AWSCodeCommitReadOnly
をアタッチLambdaのトリガー
- Lambda 設定 → デザイナー → トリガーの追加
- トリガーの設定 →
CodeCommit
を選択- リポジトリ名選択、トリガー名に
slackWebhookTrigger
など入力、ブランチ名をすべてのブランチを選択- 追加
通知のテスト
- CodeCommit リポジトリ選択
- 設定 → トリガー →
slackWebhookTrigger
などトリガー名のリンク- ページ下部 → トリガーのテスト
Lambdaの注意点
環境変数を設定しないと通知内容に含まれる時刻がUTCになってしまいます。以下を設定します。
- Lambda 設定 → 環境変数 → キー:
TZ
、値:Asia/Tokyo
を追加デバッグ
Lambda関数内のconsole.logのコメントアウトを外し、CloudWatch Logsでどこでエラーが発生しているか確認します。
参考URL
例: AWS Lambda 関数の AWS CodeCommit トリガーを作成する
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-notify-lambda.html以上です。