Awesome
Technologies
世界の最新技術を、仲間と楽しむ。
エンジニアの新しいソーシャルメディア。
8文字以上、英・数・記号が使えます
登録には 利用規約 に同意する必要があります。
SERVICE

世界の最新技術コミュニティ、
SHIMBAへようこそ!

最新技術が好きなエンジニアの、
ソーシャルメディアプラットフォームです。
ハイレベルなエンジニアが
あなたに注目
あなたの書いた記事は、SHIMBAの最新技術コミュニティによって評価されます。記事が注目を得ることで、あなたの技術・開発中のプロダクトに注目が集まります。
あなたの記事を世界に発信
SHIMBAコミュニティであなたの書いた・評価した記事は世界中へ公開され、企業や個人に注目されます。トレンドな情報を誰よりも早く、世界へ届けましょう。
あなたの活躍を独自の
アルゴリズムで評価
SHIMBAでは、独自のアルゴリズムであなたの技術コミュニティへの貢献度を評価します。 SHIMBAにしか存在しない、最新技術コミュニティで活躍しましょう。
RELATED ARTICLES

おすすめ記事一覧

Cognitoの既存ユーザーの電話番号を削除する方法
# 概要 CognitoUserPoolの指定の既存ユーザーの電話番号を削除し、加えてphone_number_verifiedもfalseにするユースケースの紹介。 # ソースコード `deleteUserPoolPhoneNumber` を実行すると、指定のusernameユーザーの電話番号属性が削除されます。 ```js const setUserMFAPreference = async ( username, twoStepAuthentication, userPoolId ) => new Promise((resolve) => { const params = { Username: username, UserPoolId: userPoolId, MFAOptions: [] }; if (twoStepAuthentication) { params.MFAOptions.push({ AttributeName: 'phone_number', DeliveryMedium: 'SMS' }); } cognitoIdentityServiceProvider.adminSetUserSettings(params, (err, data) => { if (err) { throw err; } else { console.log( 'Set CognitoUserPool Multi-factor authentication :', username ); resolve(data); } }); }); const deleteUserPoolPhoneNumber = async (username, userPoolId) => new Promise((resolve) => { setUserMFAPreference(username, false, userPoolId) .then(() => { const params = { UserAttributeNames: ['phone_number'], // phone_number_verifiedは自動的にfalseに変更されるので指定しない UserPoolId: userPoolId, Username: username }; cognitoIdentityServiceProvider.adminDeleteUserAttributes( params, (err, data) => { if (err) { throw err; } else { resolve(data); } } ); }) .catch((e) => { throw e; }); }); ``` # まとめ Cognitoの認証実装方法を覚えるといろんなプラットフォームでも応用効くので、初学者はCognitoのSDK仕様を一度調べてみると良いだろうと思う。
2021.01.13
CognitoのテストをMock化してみた
# 概要 テスト実行時のCognitoへリクエストを連打するのはあまりよろしくないので、ローカルでの単体テスト時はMock化しました。 # ソースコード aws-sdk-mockなるライブラリあったけど、動作が不安定だったので結局JestでMock化。 promise()関数で戻り値を取得するタイプと、callback関数で戻り値を取得するタイプと2つあるので注意が必要。 ```js import * as AWS from 'aws-sdk'; beforeAll(async () => { jest .spyOn(AWS.CognitoIdentityServiceProvider.services['2016-04-18'].prototype, 'adminCreateUser') .mockImplementation((request) => { return {promise: () => 'ok'} }) jest .spyOn(AWS.CognitoIdentityServiceProvider.services['2016-04-18'].prototype, 'adminAddUserToGroup') .mockImplementation((request) => { return {promise: () => 'ok'} }) jest .spyOn(AWS.CognitoIdentityServiceProvider.services['2016-04-18'].prototype, 'adminSetUserPassword') .mockImplementation((request, callback) => { callback(null, 'ok'); }) jest .spyOn(AWS.CognitoIdentityServiceProvider.services['2016-04-18'].prototype, 'adminSetUserSettings') .mockImplementation((request, callback) => { callback(null, 'ok'); }) }) ``` callbackの場合のMockの作り方に悩んだ・・。 Amplifyの裏側のソースコードを読んだら答えがあったので、これもシェアしておきます。 https://github.com/aws-amplify/amplify-js/pull/398/files/f0136c16fb10e58d5a779b96bd50397257340592 AWSSDKの仕様で詰まったら、GithubでSDKのソースコードと見ると答えがあるので参考に。
2021.01.07
DynamoDBの指定テーブルを物理削除するBatch処理を作成してみた
# 概要 開発中にDynamoDBを物理削除したい時がしばしば。例えば、CloudFormationを使用したデプロイを行っている際に、DynamoDBのデプロイは疎通したけど他のデプロイタスクで転けた場合に、次回のデプロイでDynamoDBのテーブルが既に存在するというエラーの時には物理削除をする必要があるだろうと思う。 # ソースコード ```js // batch/deleteDynamoDBAllTable.js const prefix = process.argv[2]; // ここに任意のテーブル名を追加 const tables = [ `${prefix}-User`, `${prefix}-Article`, `${prefix}-ArticleCategory` ]; Promise.all( tables.map(async (tableName) => { console.log({ TableName: tableName }); return ddb.deleteTable({ TableName: tableName }, function (err, data) { if (err) { return ( 'Unable to delete table. Error JSON:', JSON.stringify(err, null, 2) ); } return ( 'Deleted table. Table description JSON:', JSON.stringify(data, null, 2) ); }); }) ) .then(console.log) .catch(console.error); ``` ```shell $ node batch/deleteDynamoDBAllTable.js dev ``` 既存でデータが存在していてそれを残したい場合は、かならずバックアップの上実行することを推奨します。
2021.01.07
JestでDynamoDBをMock化してみた
# 概要 Lambdaのテストを書いているとき、DynamoDBに障害が発生したケースをMock化したい時がしばしばあります。AWSSDKのMock化方法は色々とありますが、今回はAWSSDKとJestを使用したシンプルなMock作成方法を紹介します。 # ソースコード ```js const lambdaFunction = require("../../src/functions/ExampleFunctions") test('異常系 : DynamoDB通信障害', () => { jest .spyOn(AWS.DynamoDB.DocumentClient.prototype, 'put') .mockImplementationOnce((request) => { throw new Error('DynamoDB Error'); }); const context = {}; const callback = jest.fn(); const event = {} // 正常系のパラメーターを設定 // DynamoDB通信障害時はThrowされることをテスト await expect( lambdaFunction.handler(immediateEvent, context, callback) ).rejects.toThrow(); }) ``` # 応用 上記を応用すると色々な検証を行うことが可能です。 ```js ... test('異常系 : DynamoDB通信障害', () => { let callDynamoPutOperations = [] jest .spyOn(AWS.DynamoDB.DocumentClient.prototype, 'put') .mockImplementationOnce((request) => { // PUTのリクエストパラメーターを格納しておく callDynamoPutOperations.push(request) throw new Error('DynamoDB Error'); }); const context = {}; const callback = jest.fn(); const event = {} await expect( lambdaFunction.handler(immediateEvent, context, callback) ).rejects.toThrow(); // 初回のPUTで失敗した場合は後続のPUTは実行されないことを検証 expect(_.size(callDynamoPutOperations)).toBe(1) }) ``` # まとめ 本記事を応用するとCognitoやその他のSDKの振る舞いをMock化することが可能です。Mock化覚えてAWSLambdaの開発スキルを上げましょう。(私はFargateにデプロイ想定のソースコードに対しも本記事の方法を利用することが多いです) ## 開発サービスの紹介 https://www.ragate.co.jp/service/aws_solutions/
2021.01.07
Cognitoへサインアップ直後のユーザーを、CONFIRMEDへ強制的に移行させる方法
# 概要 サインアップ直後のユーザープールのユーザーは、パスワード変更要求状態となり、初回サインイン時にパスワード変更を要求されます。ただ、管理者でユーザーをサインアップさせる際に、すぐにサインアップ可能状態にしたいケースがしばしばあります。 # adminSetUserPasswordを使用してユーザーのパスワードを一度更新 createUser関数を実行後に、setAdminPasswordを実行すると該当ユーザーはCONFIRMEDとなり、ユーザーはサインイン可能状態となります。 どうぞコピペでご利用ください〜👍 ```js /** * Cognitoへのユーザーの作成 * @param username * @param password * @param phoneNumber * @param userPoolId * @returns {Promise<void>} */ const createUser = async (username, password, phoneNumber, userPoolId) => { const params = { UserPoolId: userPoolId, Username: username, TemporaryPassword: password }; if (phoneNumber) { _.assign(params, { UserAttributes: [ { Name: 'phone_number', Value: phoneNumber }, { Name: 'phone_number_verified', Value: 'true' } ], MessageAction: 'SUPPRESS' }); } const res = await cognitoIdentityServiceProvider .adminCreateUser(params) .promise(); console.log('Created CognitoUserPool', res); await res; }; /** * ユーザーのパスワードを確定(CONFIRMEDへ強制的に移行) * @param username * @param password * @param userPoolId * @returns {Promise<void>} */ const setAdminPassword = async (username, password, userPoolId) => { const params = { Password: password, UserPoolId: userPoolId, Username: username, Permanent: true }; await cognitoIdentityServiceProvider.adminSetUserPassword(params, function ( err, data ) { if (err) { throw err; } console.log('adminSetUserPassword CognitoUserPool', params); return data; }); }; ``` # 余談 まぁ本来はパスワードを第三者が知ること自体よくないので、ユーザー自身にパスワードを入力させるようにしましょう。Cognitoのデフォルト設定に則りSDK利用することで、セキュア認証を簡単に構築できます。
2021.01.07
記事一覧へ
Let's Challenge together !!
世界の最新技術コミュニティに参加しませんか?
SIGN UP