Fargateでaws-sdk、sesを利用してメール送信する際タイムアウトになる
解決したいこと
Fargate上のGoアプリケーションでメールを送信したいです。
概略図は、大まかに以下のようになっており、図中にはありませんが、VPCエンドポイント部分は、Egress用プライベートサブネットに属して、ECRなどをアクセスしている感じです。
図中のバックエンドの部分で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
}
自分で試したこと
- com.amazonaws.ap-northeast-1.email-smtp でVPCエンドポイントを作成し、Egress用プライベートサブネットに対して紐付け
https://www.tdi.co.jp/miso/aws-private-subnet-ses(参考にした記事) - ingressのインバウンドポートを25万ポートを追加
1