0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS日記28 (Amazon VPC)

Last updated at Posted at 2021-06-30

はじめに

今回は Amazon VPC を試します。
VPC, Subnet 生成して Lambda 上で参照します。
今回作成した Lambda関数・SAMテンプレートはGithubに。

準備

AWS SAM の準備をします

[Amazon VPCの資料]
Amazon VPC

AWS SAM テンプレート作成

AWS SAM テンプレートで API-Gateway , Lambda, Amazon VPC の設定をします。

[参考資料]
AWS SAM テンプレートを作成する

Amazon VPCの設定は以下の部分

  SampleVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCidrBlock
      EnableDnsHostnames: true
      EnableDnsSupport: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: !Ref VpcName

  SamplePublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Ref AZ
      CidrBlock: !Ref PublicSubnetCidrBlock
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Ref PublicSubnetName
      VpcId: !Ref SampleVPC

Lambda関数作成

※ Lambda関数は aws-lambda-go を利用しました。
Amazon VPC の操作は aws-sdk-go-v2/service/ec2 を利用しました。

VPC のデータを取得するには DescribeVpcs を使う

func getVpcs(ctx context.Context)(string, error) {
	if ec2Client == nil {
		ec2Client = ec2.NewFromConfig(getConfig(ctx))
	}
	input := &ec2.DescribeVpcsInput{
		VpcIds: []string{os.Getenv("VPC_ID")},
	}

	result, err := ec2Client.DescribeVpcs(ctx, input)
	if err != nil {
		log.Print(err)
		return "", err
	}
	if len(result.Vpcs) < 1 {
		err := fmt.Errorf("No Vpcs")
		log.Print(err)
		return "", err
	}
	resultJson, err := json.Marshal(VpcData{
		VpcId: aws.ToString(result.Vpcs[0].VpcId),
		CidrBlock: aws.ToString(result.Vpcs[0].CidrBlock),
	})
	if err != nil {
		log.Print(err)
		return "", err
	}
	return string(resultJson), nil
}

Subnet のデータを取得するには DescribeSubnets を使う

func getSubnets(ctx context.Context)(string, error) {
	if ec2Client == nil {
		ec2Client = ec2.NewFromConfig(getConfig(ctx))
	}
	input := &ec2.DescribeSubnetsInput{
		SubnetIds: []string{os.Getenv("SUBNET_ID")},
	}

	result, err := ec2Client.DescribeSubnets(ctx, input)
	if err != nil {
		log.Print(err)
		return "", err
	}
	if len(result.Subnets) < 1 {
		err := fmt.Errorf("No Subnets")
		log.Print(err)
		return "", err
	}
	resultJson, err := json.Marshal(SubnetData{
		SubnetId: aws.ToString(result.Subnets[0].SubnetId),
		CidrBlock: aws.ToString(result.Subnets[0].CidrBlock),
		AvailabilityZone: aws.ToString(result.Subnets[0].AvailabilityZone),
	})
	if err != nil {
		log.Print(err)
		return "", err
	}
	return string(resultJson), nil
}

終わりに

VPC, Subnet 生成し、Lambda上で参照出来るようにしました。
EC2やFargateElastiCacheなどを使用する際に利用できます。

参考資料
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?