Yuki-TU
@Yuki-TU

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Fargateでaws-sdk、sesを利用してメール送信する際タイムアウトになる

解決したいこと

Fargate上のGoアプリケーションでメールを送信したいです。

概略図は、大まかに以下のようになっており、図中にはありませんが、VPCエンドポイント部分は、Egress用プライベートサブネットに属して、ECRなどをアクセスしている感じです。

image.png

図中のバックエンドの部分でgolangのAWS SDK v1を利用して、メール送信する機能を持っています。

SESにアクセスできるポリシーをアタッチしたIAMユーザを作成し、accesskey, secretkeyを利用して、SDK初期化してメール送信するっていう感じです。(後ほどロール管理に切り替える予定)

発生している問題・エラー

ローカル環境で試した時にはメール送信ができるのは確認できております。ただ、Fargateにデプロイするとタイムアウトエラーになる状況です。
504タイムエラーになります。
ポートら辺が怪しいかなって思っているのですが、、、解決に至らずです。

該当するソースコード

街頭ソースコード

mail.go
package email

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/ses"
	"github.com/sample/sample/config"
)
func SendMail(recipient string, subject string, textBody string) (*ses.SendEmailOutput, error) {
	// 環境変数の読み込み
	cfg, err := config.New()
	if err != nil {
		return nil, err
	}
    // 初期化
	sess, err := session.NewSession(&aws.Config{
		Region: aws.String(cfg.AWSRegion),
		Endpoint:   aws.String("https://email.ap-northeast-1.amazonaws.com"),
		MaxRetries: aws.Int(3),
		Credentials: credentials.NewStaticCredentials(cfg.AWSId, cfg.AWSSecret, "")},
	)
	if err != nil {
		return nil, err
	}
	svc := ses.New(sess)
    // メール作成
	input := &ses.SendEmailInput{
    // 略
    }

	// メールの送信
	result, err := svc.SendEmail(input)
	if err != nil {
		if aerr, ok := err.(awserr.Error); ok {
			switch aerr.Code() {
			case ses.ErrCodeMessageRejected:
				return nil, fmt.Errorf("message rejected: %w", aerr)
			case ses.ErrCodeMailFromDomainNotVerifiedException:
				return nil, fmt.Errorf("mail from domain not verified: %w", aerr)
			case ses.ErrCodeConfigurationSetDoesNotExistException:
				return nil, fmt.Errorf("configuration set does not exist: %w", aerr)
			default:
				return nil, aerr
			}
		}
		return nil, err
	}
	return result, nil
}

自分で試したこと

1

1Answer

Comments

  1. @Yuki-TU

    Questioner

    コメントありがとうございます。
    @bigen1925さんのいうとおりです。

    原因としては、NATGatewayを正しく設定されていなかったことが原因でした。
    SDKでは外部エンドポイント(email.ap-northeast-1.amazonaws.comなど)にアクセスし、メールを送信することになっており、
    private subnet(上記図のバックエンド)から外部エンドポイントにアクセスする際は、NATgatewayを正しく設定されていないと外部に通信できず、タイムアウトエラーになっておりました。
    以下の記事を参考にNATgatewayを正しく設定することで解決に至りました。
    https://qiita.com/fkooo/items/a474db0f3c2e72448d36

Your answer might help someone💌