📚

SAMでlambda + 固定IP

2022/04/05に公開

目的

固定IPをもつlambdaを作ること

SAMとは?みたいな話はググってください。

前提

  • ubuntuでの検証
  • dockerインストール済み

流れ

  1. SAM CLIインストール
  2. SAMでテンプレート作成
  3. SAMでデプロイ

1. SAM CLIインストール

$ wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip

$ unzip aws-sam-cli-linux-x86_64.zip -d sam-installation

$ sudo ./sam-installation/install

$ sam --version

特に言うことはないのでただインストールしてください。
versionが表示されたらOKです。

2. SAMでテンプレート作成

ちょっと長いですがコードを直接貼ってコメントで解説つけます。
以下コピペで必要なところだけ変更してもらえれば動くと思います。

sam initで生成したものに固定IPの設定を追加しました。

--- 省略

# Resources以下で利用
Parameters:
  VpcID:
    # 既存のVPCを使いたかったのであえて指定しています。
    Type: AWS::EC2::VPC::Id
    # VPCのIDを指定
    Default: "vpc-hogehoge"
  SecurityGroupID:
    # 既存のセキュリティグループを使いたいので指定。
    Type: AWS::EC2::SecurityGroup::Id
    Default: "sg-hogehoge"
  # cidrブロックの指定
  PublicSubnetCidrBlock:
    Type: String
    Default: "10.0.1.0/24"
  PrivateSubnetCidrBlock:
    Type: String
    Default: "10.0.2.0/24"

Resources:
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VpcID
      CidrBlock: !Ref PublicSubnetCidrBlock
      MapPublicIpOnLaunch: false
      AvailabilityZone: !Select
        - 0
        - Fn::GetAZs: !Ref "AWS::Region"

  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VpcID
      CidrBlock: !Ref PrivateSubnetCidrBlock
      MapPublicIpOnLaunch: false
      AvailabilityZone: !Select
        - 0
        - Fn::GetAZs: !Ref "AWS::Region"

  InternetGateway:
    Type: AWS::EC2::InternetGateway

  VpcAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VpcID

  VpcPublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VpcID

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: VpcAttachment
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId: !Ref VpcPublicRouteTable
      GatewayId: !Ref InternetGateway

  SubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref VpcPublicRouteTable
      SubnetId: !Ref PublicSubnet
   
  # 固定IPの取得
  ElasticIp:
    Type: AWS::EC2::EIP

  NatGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt ElasticIp.AllocationId
      SubnetId: !Ref PublicSubnet

  VpcPrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VpcID

  PrivateRoute:
    Type: AWS::EC2::Route
    DependsOn: VpcAttachment
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId: !Ref VpcPrivateRouteTable
      NatGatewayId: !Ref NatGateway

  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref VpcPrivateRouteTable
      SubnetId: !Ref PrivateSubnet

  HelloWorld:
    Type: AWS::Serverless::Function 
    Properties:
      PackageType: Image
      MemorySize: 2048
      Timeout: 600
      Architectures:
        - x86_64
      Policies:
        - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
      VpcConfig:
        SecurityGroupIds:
          - !Ref SecurityGroupID
        SubnetIds:
          - !Ref PrivateSubnet
        # goの設定はsam initでgoを選択したためです。
    Metadata:
      DockerTag: go1.x-v1
      DockerContext: ./src
      Dockerfile: Dockerfile

3. SAMでデプロイ

以下コマンドで対話式でデプロイをしてくれます。

$ sam deploy --guided

Discussion