Lambdaを使用して暗号化し、Google Apps Script(GAS)上で復号化する方法
LambdaレイヤーにCryptoJSライブラリを追加する
CryptoJSライブラリは Lambda に含まれていないため、自分でレイヤーを作成する必要があります。
LambdaレイヤーでNode.jsの依存関係を使用する際には、特定のディレクトリ構造が要求されます。
その構造は以下のようになります:
nodejs/
└── node_modules/
└── [パッケージ名]/
Lambdaレイヤー用のlambda_layer
ディレクトリを作成し、その中にnodejs
ディレクトリを作成し、さらにその中にnode_modules
ディレクトリを作成します。
mkdir -p lambda_layer/nodejs/node_modules
lambda_layer
ディレクトリに移動します。
cd lambda_layer/nodejs
Lambdaレイヤー用のパッケージをインストールするために、ダミーのpackage.json
ファイルを作成します。
echo '{}' > package.json
CryptoJSライブラリをインストールします。
npm install crypto-js
Lambdaレイヤーに不要なファイルを削除します。
rm package.json package-lock.json
圧縮するために現在のディレクトリから一つ上の階層に移動します。
cd ..
crypto-js
ディレクトリをzipアーカイブに圧縮します。
zip -r crypto-js.zip nodejs
作成したzipファイルをレイヤーにアップロードしてレイヤーを作成してください。
Lambda関数
先ほど作成したレイヤーを追加してコード内容は下記とします。
import CryptoJS from 'crypto-js';
export const handler = async () => {
const key = 'key'; // 暗号化に使用する鍵
const date = '暗号化する文字列';
// 暗号化
const encryptedString = CryptoJS.AES.encrypt(date,key).toString();
// リターンして内容を確認する記述例
return ContentService.createTextOutput(
JSON.stringify({
result: 'success',
encryptedString : encryptedString ,
})
).setMimeType(ContentService.MimeType.JSON);
GASにライブラリを追加する
CryptoJSを使用してデータの暗号化と復号化を行うことができるCryptoJS libraries for Google Apps Scriptライブラリを追加します。
その他GASで追加できるライブラリ一覧
コンソール画面の左メニューからライブラリ
を選択
1IEkpeS8hsMSVLRdCMprij996zG6ek9UvGwcCJao_hlDMlgbWWvJpONrs
を入力し、
検索
を押してください。
ライブラリの内容が表示されたら追加
を選択
cCryptoGS
というライブラリが追加されているのがわかると思います。
GAS上での記述
POSTリクエストしてください。
ライブラリの使い方は下記を参考にさせていただきました。
const doPost = (e: GoogleAppsScript.Events.DoPost) => {
const payload = JSON.parse(e.postData.contents);
const data = payload.data;
const secretKey = 'key';
const cipher = new cCryptoGS.Cipher(secretKey, 'aes');
// 暗号化されたデータの復号
const decryptedData = cipher.decrypt(data);
console.log('decryptedData',decryptedData)
}
asideを使用してデプロイした場合
ライブラリを追加後に再度デプロイした場合は、ライブラリが消えてしまいます。
解決策としては、もう一度上記の手順でライブラリを追加しても良いのですが、デプロイするたびに追加するのは手間がかかるので、下記の記事を参考にappsscript.jsonを編集してください。
PythonでAESを使用して暗号化する場合
以下のみ記述しておきます。
cryptographyライブラリを使用するため、レイヤーを追加してください。
cryptography
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p39-cryptography:19ローカル環境で開発する場合
asideなどでローカル環境で開発する場合、cCryptoGS
でCannot find name 'cCryptoGS'. Did you mean 'CryptoJS'?ts(2552)
というエラーが出てしまうと思います。
TypeScriptの型定義ファイルを作成してください。
// declare namespace cCryptoGS {
namespace cCryptoGS {
class Cipher {
constructor(secretKey: string, algorithm: string);
// decrypt メソッドの型定義を追加
// decrypt(encryptedText: string): string;
}
}
ウェブアプリでデプロイする際にURLを変えない
新しいデプロイ
を選択してしまうとURLが変更されてしまうので、デプロイ管理
を選択
右上の鉛筆アイコンを選択、新バージョン
を選択し、右下のデプロイ
を押すと、URLが変更されず新しくデプロイができます。
古いバージョンは削除しないと溜まっていくので、左側のメニューのプロジェクト履歴
を選択すると右にプロジェクト一覧が表示されるので、不要なバージョンを削除してください。
終わりに
何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉
Discussion