[Netlify Forms와 연계] AWS Lambda에 Gmail 자동 회신 스크립트(Node.js)를 배포하여 API화.

Gatsby.js를 사용하여 Netlify에 배포하는 프로젝트를 진행하고 있었는데, 문의 양식의 작성에 번거로웠기 때문에 비망록.

전제



대상 독자는
· node.js의 사용 경험은 적당히 있다. 이것은 필수입니다.
· lambda의 존재와 버릇의 힘을 어느 정도 파악하고 있다. 혹은, 어떤 버릇이라도 걸려 오라는 정신이 있는 사람.
・api gateway와 lambda의 제휴를 실시한 적이 있다. 혹은, 자력으로 어떻게든 할 수 있는 자신이 있는 사람.
만나면 모든 사람이 할 수 있다고 생각합니다.

참고 사이트 등



· 상세한. 여기에 따르면 기본 괜찮습니다 (영어입니다.)
· 이해하기 쉽다. 코드 이외는 여기에 따르면 괜찮습니다 (일본어입니다.)

환경 설정



1.netlify forms를 셋업 (이것이 없어도 API화할 수 있습니다만, API를 테스트하는 검증용이라고 하는 느낌입니다.)

2. 여기 에 스크립트를 준비했으므로, 로컬에 떨어뜨린다 (코드는 아래에도 붙여 둡니다.)

3. 위의 참고 사이트에서 이번 사용하는 "clientId"와 "clientSecret"과 "refreshToken"을 메모하고 2에서 다운로드한 스크립트에 기재.

4. 디렉토리 아래에서 zip -r deploy.zip *를 실행하고 zip 화 (aws serverless framework를 사용하고 싶은 사람은 각각 설정하십시오)

5. 일단 lambda의 타임 아웃 시간을 10초 정도로 해 둡시다. 저장하십시오.

6.api gateway에서 lambda를 배포합니다. (나중에 자세히 설명하겠습니다. 한마디로, 메소드를 POST로 설정하고 프록시 통합하면 괜찮습니다.)

7.netlify forms notification에 Outgoing webhook 트리거를 설정합니다. (나중에 가볍게 설명합니다. 자신의 netlify 기본 URL/settings/forms #form-notifications에서 설정할 수 있습니다.)

8.이상으로 완성

라는 흐름이 됩니다. 3까지는 단순 작업이므로, 뭔가 누출이 없으면 괜찮을 것입니다. 5,6등은 aws의 사용법이 됩니다만, 경험이 없는 분에게는 부담이 많은 작업이 된다고 생각하므로 나중에 설명합니다. 7에 관해서는, 틈새 설정이 됩니다만, ui를 알기 쉽기 때문에 괜찮다고 생각합니다.

6.api gateway에서 lambda를 배포합니다. 소개



저는 이하의 구성으로 실현하고 있습니다.

메소드의 설정은,

괜찮습니다.
물론 Lambda 함수는 직접 만든 lambda 함수 이름을 사용합니다.

다음에 사용하므로 배포 대상 URL을 기록해 두십시오.

7.netlify forms notification에 Outgoing webhook 트리거를 설정합니다.



먼저 Netlify의 Setings 페이지로 이동하십시오. 거기에서 Forms를 클릭하십시오.

그런 다음 Form notifications에서 Add notification을 클릭하고 Outgoing webhook을 선택합니다.


코드



index.js
const nodemailer = require("nodemailer");
const {
    google
} = require("googleapis");
const OAuth2 = google.auth.OAuth2;

const mymail = "送信元のgmailアドレス";
const clientId = "OAuthのclientId";
const clientSecret = "OAuthのclientSecret";
const refreshToken = "//developers.google.com/oauthplaygroundで取得したrefreshToken";

exports.handler = async (event, context, callback) => {
    //netlify formのqueryをparseして自動返信先のメールアドレスを取得.
    const tomail = JSON.parse(event.body).email;

    const start = async () => {
        const oauth2Client = new OAuth2(
            clientId,
            clientSecret,
            "https://developers.google.com/oauthplayground"
        );

        oauth2Client.setCredentials({
            refresh_token: refreshToken
        });
        //アクセストークンに制限時間があるっぽい?ので毎度取得します。
        const accessToken = await oauth2Client.getAccessToken()

        const smtpTransport = nodemailer.createTransport({
            service: "gmail",
            host: 'smtp.gmail.com',
            port: 465,
            secure: true,
            auth: {
                type: "OAuth2",
                user: mymail,
                clientId: clientId,
                clientSecret: clientSecret,
                refreshToken: refreshToken,
                accessToken: accessToken
            }
        });

        const sendMail = async (mailingList) => {
            const mailOptions = {
                from: mymail,
                to: mailingList.join(', '),
                subject: "お問い合わせありがとうございます。",
                text: `${JSON.parse(event.body).email}様、お問い合わせありがとうございます。`
            };
            return await new Promise((resolve, reject) => {
                smtpTransport.sendMail(mailOptions, (error, response) => {
                    error ? console.log(error) : console.log(response);
                    smtpTransport.close();
                    resolve();
                });
            });
        };

        await sendMail([tomail, mymail]);
        return;
    }

    await start().then(() => console.log('done'));


    //aws lambdaでは、responseの形式が決まっているので、適当に記述。
    const response = {
        statusCode: 200,
        headers: {
            "x-custom-header" : "netlify forms test"
        },
        body: JSON.stringify(event)
    };

    return response;
};

요약



별로 시간이 없고, 심플한 메모가 되고 있습니다만, 보충 리퀘스트등 있으면 부탁합니다. 시간 있을 때에 추기해 둡니다.

좋은 웹페이지 즐겨찾기