ラベル Golang の投稿を表示しています。 すべての投稿を表示
ラベル Golang の投稿を表示しています。 すべての投稿を表示

2019年10月4日金曜日

beegoのローカル開発環境でsslを使う方法

自己証明書を作成

  • プライベートキーを作成
$ openssl genrsa -out private_key 2048
Generating RSA private key, 2048 bit long modulus
...........................................+++
...........................+++
e is 65537 (0x10001)
  • パブリックキーを作成
$ openssl req -new -x509 -key private_key -out public_key -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:jp
State or Province Name (full name) []:tokyo
Locality Name (eg, city) []:tokyo
Organization Name (eg, company) []:dmm.com
Organizational Unit Name (eg, section) []:dmm.com
Common Name (eg, fully qualified host name) []:test.dmm.com
Email Address []:test@dmm.com

sslを有効にするため、設定ファイル(app.con)に情報を追加

設定ファイル(./conf/app.conf)に、以下の情報を追加します。
EnableHTTPS = true
HTTPSPort = 443
HTTPSCertFile = "./local_cert/public_key" # 前のステップで作ったパブリックキーのファイルのフルパスを入れる。 自分の場合は「プロジェクトのパス/local_cert/」の直下に置いたのでそのような設定
HTTPSKeyFile = "./local_cert/private_key" # 前のステップで作ったプライベートキーのファイルのフルパスを入れる

beeコマンドで再起動

bee runコマンドで再起動します。以下のような情報が表示されるはずです。
$ bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0
2019/10/03 15:41:27 INFO     ▶ 0001 Using 'example-web' as 'appname'
2019/10/03 15:41:27 INFO     ▶ 0002 Initializing watcher...
2019/10/03 15:41:34 SUCCESS ▶ 0003 Built Successfully!
2019/10/03 15:41:34 INFO     ▶ 0004 Restarting 'magazine-front'...
2019/10/03 15:41:34 SUCCESS ▶ 0005 './magazine-front' is running...
2019/10/03 15:41:34.828 [I] [asm_amd64.s:1337]  http server Running on http://:8080
2019/10/03 15:41:34.829 [I] [asm_amd64.s:1337]  https server Running on https://:443
2019/10/03 15:42:06.284 [server.go:3010]  [HTTP] http: TLS handshake error from 127.0.0.1:56856: remote error: tls: unknown certificate
2019/10/03 15:42:09.062 [server.go:3010]  [HTTP] http: TLS handshake error from 127.0.0.1:56881: remote error: tls: unknown certificate

ブラウザーでsslページの動作を確認

最後ブラウザーに「https://127.0.0.1」を入れて、動作を確認します。「この接続ではプライバシーが保護されません...」が表示されたら、「詳細設定」/「127.0.0.1 にアクセスする(安全ではありません)」の順に進めます。

2019年9月13日金曜日

Golang言語でAWS SESを介してメールを送信する方法

Golangで開発したウェブアプリケーションからメール送信機能が必要になりました。インフラはAWS上にあるので、AWS SES(Simple Email Service)を使うことにしました。AWS SESサービスの開始から、Golangで送信までの手順をまとめてみました。

SESサービスを開始

AWSのSimple Email Serviceコンソール画面を開きます。
最初はリージョン選択になります。日本リージョンがないので、3つから任意の一つを選びます。

ドメイン認証

左メニュー「Domains」/「Verify a New Domain」順にドメイン認証画面を開きます。
自分のドメインを入力し、「Generate DKIM Settings」もチェックします。

確認画面の「Use Route 53」ボタンをクリックします。

Use Route 53画面の「Create Record Sets」ボタンをクリックします。
※一つ注意してほしいのは、もし「Email Receiving Record」にチェックを入れたら、MXタイプのレコードが全部上書きされることになります。回避するにはここでチェックを外して、Route 53の管理画面から手動でレコードを追加することです。

Route53の管理画面に、対象ドメインに先程のレコードが追加されたことを確認できます。
そのまましばらく待つと、認証ステータスが「verified」に変わります。

「FROM Domain」の設定

FROMドメインを設定しないと、メールの送信元はamazonses.comとなってしまいます。以下の手順で自分のドメインに変えられます。
「Domains」/「対象ドメイン名」/「MAIL FROM Domain」/「Set MAIL FROM Domain」の順にクリックします。
FROMドメインの設定画面に、MAIL FROMドメインの名前を入力します。例:info
そして、「Use amazonses.com as MAIL FROM」をチェックします。

次の画面に、「Publish Records Using Route 53」ボタンをクリックします。

更に次のUse Route 53画面に、「MX Record」と「SPF Record」にチェックを入れて、「Create Record Sets」ボタンをクリックします。

前のステップと同じくしばらく待つと、ステータスが「pending verification」から「verified」に変わります。

最後、サンドボックスの外への移動

サンドボックスから"脱出"するに、上限申請が必要です。
「Sending Statistics」/「Request a Sending Limit Increase」の順に申請画面に移動します。

申請する上限数のところに、自分の負荷に応じで必要な数値を入力します。
申請後1日、2日を待ってば処理されます。

ちなみに、申請が通りまでに、テストメールを送信すると、以下のエラーが起きます。

Email address is not verified. The following identities failed the check in region US-EAST-1: test@gmail.com (Request ID: 32301551-966e-462e-bdab-6a23ef58f6a4)


最後、Golangで送信する

まず、以下の4つのパッケージをインストール

  go get github.com/aws/aws-sdk-go/aws
  go get github.com/aws/aws-sdk-go/aws/credentials
  go get github.com/aws/aws-sdk-go/aws/session
  go get github.com/aws/aws-sdk-go/service/ses
次に、メールを送信(送信部分のソースコードのみ)
awsAccessKey := "awsのアクセスキー"
awsSecretKey := "awsのシークレットキー"
awsSession := session.New(&aws.Config{
Region:      aws.String("us-east-1"),
Credentials: credentials.NewStaticCredentials(awsAccessKey, awsSecretKey, ""),
})
client := ses.New(awsSession)
input := &ses.SendEmailInput{
Destination: &ses.Destination{
ToAddresses: []*string{
aws.String("送信先のメールアドレス"),
},
},
Message: &ses.Message{
Body: &ses.Body{
Text: &ses.Content{
Charset: aws.String("UTF-8"),
Data:    aws.String("メール本文"),
},
},
Subject: &ses.Content{
Charset: aws.String("UTF-8"),
Data:    aws.String("メール件名"),
},
},
Source: aws.String("送信元のメールアドレス"),
}
_, err := client.SendEmail(input)

2019年8月30日金曜日

Visual Studioを使ってGolang開発時に、覚えておけば開発スピードがだいぶ上がれるショートカットキー一覧

Golangの開発エディターといえば、Visual Studioはかなりおすすめです。
しかも無料です。
最小限に以下のショートカットキーを覚えておけば開発スピードがだいぶ上げられます。

1. Ctrl + TAB

開いたタブを切り替え

2. Ctrl+SHIFT+TAB

前回開いたタブを開く

3. Ctrl+Shift+S 

全保存

4. Command+F

検索

5. Command+Shift+F

全ファイルから検索

6. F3

次を検索

7. Shift+F3

前を検索

8. Shift+Option+左クリック

矩形選択

9. Ctrl+G

指定行へジャンプ

10. Ctrl+E

行末に移動

11. Ctrl+-

直前に参照した行に移動

12. Command+p

指定したファイルを開く

13. Command+-

縮小

14. Command+Shift++

拡大





2019年7月22日月曜日

Golangで空文字チェック

Golangの空文字チェック、主に以下の2つ方法があります。(両方とも標準ライブラリーの中に使われています。)

方法1、文字の長さをチェック

if len(s) > 0 { ... }

方法2、 strconvパッケージ関数の中に見つけることができます。

if s != "" { ... }

2019年6月27日木曜日

Golangのtry-catch的なやり方

以下のphpのtry-catchの書き方、ウェブエンジニアなら、恐らく何度でも目にしたことがあると思います。
<?php
function hoge() {
    try {
        throw new Exception("throw error\n");
    }catch(Exception $e) {
        echo $e->getMessage();
        echo "will do something to rollback";
    }
}
hoge();
?>
Golangなら、相等な書き方はないでしょうか?
答えは、あります。サンプルは下記の通りです。
package main
import (
    "fmt"
)
func hoge() {
    defer func() {
            if err := recover(); err != nil {
                    fmt.Println("catch the error.", err)
                    fmt.Println("will do something to rollback")
            }
        }()
        panic("throw exception")   
}
func main() {
    hoge()
}
簡単に説明します。
異常が発生しそうなソースコードの前に、「recover」を使って、異常を捕捉(catch)することができます。
特にDBの何かエラーが発生しそうで、rollbackをしないといけないときに、とておも役に立つと思います。
使い方は以下のように↓
func 関数名() {
    defer func() {
        if err := recover(); err != nil {
            // rollbackはここに書く
        }
    }
    // db実行などエラーが発生しそうなコードはここに書く
}