Go言語でEC2インスタンスのポートを開け閉めする

232

こんにちは。インターンの木村です。

今回はAWSのEC2インスタンスのポートをGo言語で開け閉めする方法を紹介します。

EC2でファイアーウォールの役割を果たすのは、セキュリティグループです。

基本的に全てのポートは閉じられていて、セキュリティグループに開けたいポート番号を設定することでポートを開けることができます。

aws-sdk-goでポートを開ける

結論を言うと、以下のようにコードを書くことでポートを開けることができます。

package main

import (
 "github.com/aws/aws-sdk-go/aws"
 "github.com/aws/aws-sdk-go/aws/credentials"
 "github.com/aws/aws-sdk-go/aws/session"
 "github.com/aws/aws-sdk-go/service/ec2"
)

func main() {
 profilename := "mobingi-yuto" //aws credentials 名。~/.aws/credentialsに認証情報を書く。
 awsRegion := "ap-northeast-1"

 //認証情報読み込みとクライアント作成
 sess := session.Must(session.NewSession())
 cred := credentials.NewSharedCredentials("", profilename)
 ec2Client := ec2.New(sess, &aws.Config{Credentials: cred,
 Region: aws.String(awsRegion)})

 securityID := aws.String("sg-c3ec8da5") //操作したいセキュリティーグループのID
 requestPort := aws.Int64(1111) //開け閉めしたいポート番号

 //リクエストデータ作成
 iprange := []*ec2.IpRange{&ec2.IpRange{CidrIp: aws.String("0.0.0.0/0")}}
 permission := &ec2.IpPermission{
 FromPort: requestPort,
 IpProtocol: aws.String("tcp"),
 IpRanges: iprange,
 ToPort: requestPort,
 }
 openReq := &ec2.AuthorizeSecurityGroupIngressInput{GroupId: securityID}
 openReq.IpPermissions = []*ec2.IpPermission{permission}

 ec2Client.AuthorizeSecurityGroupIngress(openReq)
}

何をしているのかというと簡単にまとめると以下のようなことをしています。

  1. awsの認証情報を読み込み、ec2を操作するためのクライアントを作成
  2. ec2のAPIにリクエストするためのデータopenReqを作成
  3. Ec2client.AuthorizeSecurityGroupIngressにリクエストデータを渡す

これでrequestPort変数に設定したポート1111が開きます。

aws-sdk-goでポートを閉める

上記で開けたポートを閉めたい時は、以下のように書きます。

package main

import (
  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/credentials"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/service/ec2"
)

func main() {
  profilename := "mobingi-yuto" //aws credentials 名。~/.aws/credentialsに認証情報を書く。
  awsRegion := "ap-northeast-1"

  //認証情報読み込みとクライアント作成
  sess := session.Must(session.NewSession())
  cred := credentials.NewSharedCredentials("", profilename)
  ec2Client := ec2.New(sess, &aws.Config{Credentials: cred,
    Region: aws.String(awsRegion)})

  securityID := aws.String("sg-c3ec8da5") //操作したいセキュリティーグループのID
  requestPort := aws.Int64(1111)          //開け閉めしたいポート番号

  //リクエストデータ作成
  iprange := []*ec2.IpRange{&ec2.IpRange{CidrIp: aws.String("0.0.0.0/0")}}
  permission := &ec2.IpPermission{
    FromPort:   requestPort,
    IpProtocol: aws.String("tcp"),
    IpRanges:   iprange,
    ToPort:     requestPort,
  }
  openReq := &ec2.AuthorizeSecurityGroupIngressInput{GroupId: securityID}
  openReq.IpPermissions = []*ec2.IpPermission{permission}

  ec2Client.AuthorizeSecurityGroupIngress(openReq)

  //ここからポートを閉じる操作

  //リクエストデータ作成
  closeReq := &ec2.RevokeSecurityGroupIngressInput{GroupId: securityID}
  closeReq.IpPermissions = []*ec2.IpPermission{permission}

  ec2Client.RevokeSecurityGroupIngress(closeReq)
}

ポートを開ける操作に加えて、

  1. ポートを閉じるためのリクエストデータcloseReqを作成
  2. ec2Client.RevokeSecurityGroupIngressにリクエストデータを渡す

ということをしています。

こうすることで開けたポートを閉じることができます。

 

APIでポートを開け閉めできるの面白いですね。EC2でポートを開け閉めしたいときに試してみてください。