From a75a4cb11e415646e22cf3efb9964cac137fc60c Mon Sep 17 00:00:00 2001 From: Anton Piskunov Date: Sun, 1 Nov 2020 19:46:05 +0300 Subject: [PATCH 1/4] Impl auth token obtain logic branch. Now works with "service-account-key" config section. --- lib/provider/provider.js | 82 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/lib/provider/provider.js b/lib/provider/provider.js index 9b8d01f..2bda21e 100644 --- a/lib/provider/provider.js +++ b/lib/provider/provider.js @@ -6,6 +6,8 @@ const yc = require('yandex-cloud'); const yaml = require('yaml'); const fs = require('fs'); const path = require('path'); +const https = require('https'); +const jose = require('node-jose'); const AWS = require('aws-sdk'); @@ -66,7 +68,85 @@ class YandexCloudProvider { return; } const config = readCliConfig(); - const session = new yc.Session({oauthToken: config.token}); + + let session; + + if(config.token !== "undefined"){ + session = new yc.Session({oauthToken: config.token}); + } + + if(config['service-account-key'] !== "undefined"){ + + const serviceAccountId = config['service-account-key']['service_account_id']; + const keyId = config['service-account-key']['id']; + const key = config['service-account-key']['private_key']; + + const now = Math.floor(new Date().getTime() / 1000); + + const payload = { + aud: "https://iam.api.cloud.yandex.net/iam/v1/tokens", + iss: serviceAccountId, + iat: now, + exp: now + 3600 + }; + + let JWKBaseKeyObject = await jose.JWK.asKey(key, 'pem', { kid: keyId, alg: 'PS256' }); + let jwt = await jose.JWS.createSign({ format: 'compact' }, JWKBaseKeyObject).update(JSON.stringify(payload)).final(); + + const data = JSON.stringify({ + jwt: jwt + }); + + const options = { + hostname: 'iam.api.cloud.yandex.net', + port: 443, + path: '/iam/v1/tokens', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': data.length + } + } + + let iamToken = await (async () => { + + return new Promise(function(resolve, reject) { + + const req = https.request(options, (res) => { + + let body = ''; + + res.setEncoding("utf8"); + + res.on('data', chunk => { + body += chunk; + }); + + res.on('end', () => { + + try { + body = JSON.parse(body); + } catch(e) { + reject(e); + } + + resolve(body); + + }); + + }); + + req.write(data); + req.end(); + + }); + + })(); + + session = new yc.Session({iamToken: iamToken.iamToken}); + + } + if (config.endpoint) { await session.setEndpoint(config.endpoint); } From 21f39be848d1c6ef2fc5834de66c17a2452c2292 Mon Sep 17 00:00:00 2001 From: Anton Piskunov Date: Sun, 1 Nov 2020 20:05:34 +0300 Subject: [PATCH 2/4] Fix frameworkVersion --- templates/nodejs/serverless.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/nodejs/serverless.yml b/templates/nodejs/serverless.yml index 6e317f5..9ed8395 100644 --- a/templates/nodejs/serverless.yml +++ b/templates/nodejs/serverless.yml @@ -1,6 +1,6 @@ service: yandex-cloud-nodejs name: yandex-cloud-template -frameworkVersion: ">=1.1.0 <2.0.0" +frameworkVersion: "2" provider: name: yandex-cloud From 7eac24a8f4dd5460c97bd66725f9156e093ffd0e Mon Sep 17 00:00:00 2001 From: Anton Piskunov Date: Mon, 9 Nov 2020 01:29:46 +0300 Subject: [PATCH 3/4] Create .nvmrc in root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create .nvmrc in root for provide more transparency. Just as self-documented requirement. По итогам переписки в чате: https://t.me/yandexcloud_chat --- .nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..60d3b2f --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +15 From 9f500f55bc3b5edf5ef63dd48f22fa9878a5d4e6 Mon Sep 17 00:00:00 2001 From: Anton Piskunov Date: Mon, 9 Nov 2020 01:30:15 +0300 Subject: [PATCH 4/4] Create .nvmrc in template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create .nvmrc in root for provide more transparency. Just as self-documented requirement. По итогам переписки в чате: https://t.me/yandexcloud_chat --- templates/nodejs/.nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 templates/nodejs/.nvmrc diff --git a/templates/nodejs/.nvmrc b/templates/nodejs/.nvmrc new file mode 100644 index 0000000..60d3b2f --- /dev/null +++ b/templates/nodejs/.nvmrc @@ -0,0 +1 @@ +15