📚
SAMでlambda + 固定IP
目的
固定IPをもつlambdaを作ること
SAMとは?みたいな話はググってください。
前提
- ubuntuでの検証
- dockerインストール済み
流れ
- SAM CLIインストール
- SAMでテンプレート作成
- 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