⌨️

今から始めるLambda⑤「VPC内に配置する」

2021/10/26に公開

はじめに

前回の記事ではLambdaAPI Gatewayを組み合わせてREST APIを作成する手順について紹介しました。

https://zenn.dev/nekoniki/articles/d3feb0725e7af2

今回はあらかじめ作成したLambdaを、新たに作成したVPC内に配置する手順について紹介します。

VPCとは

https://aws.amazon.com/jp/vpc/

Amazon Virtual Private Cloud (VPC) では、リソースの配置、接続性、セキュリティなど、仮想ネットワーク環境を完全に制御することができます。最初のステップは、VPC を作成することです。次に、Amazon Elastic Compute Cloud (EC2) や Amazon Relational Database Service (RDS) インスタンスなどのリソースを追加できます。最後に、アカウント、アベイラビリティーゾーン (AZ)、リージョンを超えて、VPC 同士の通信方法を定義することができます。以下の例では、各リージョン内の 2 つの VPC 間でネットワークトラフィックを共有しています。

LambdaVPC内に配置する目的としては、同じくVPC内部に存在するRDSのDBインスタンスに接続するためです。

VPCの作成

まずはVPCの作成を行います。
これ自体はそこまで難しくなく、コマンド一発で行えます。
CIDRを指定して下記コマンドを実行します。

aws ec2 create-vpc --cidr-block 10.0.0.0/16

レスポンスとしてJSONが返ってくれば成功です。
JSONの中のVpcIdを後述のサブネット追加等で使うので、控えておきます。

実際にAWSのコンソールからVPC一覧を参照すると、作成したVPCが含まれているかと思います。

サブネットの追加

今作成したVPCに対してサブネットを追加します。
今回は10.0.0.0/2410.0.1.0/24という2種類のサブネットを追加します。
ついでにAZも分けておきます。
自分の場合はus-east-2リージョンだったので、us-east-2aus-east-2bAZを指定しました。

aws ec2 create-subnet --vpc-id 【VPC_ID】 --cidr-block 10.0.0.0/24 --availability-zone 【AZ_NAME_A】
aws ec2 create-subnet --vpc-id 【VPC_ID】 --cidr-block 10.0.1.0/24 --availability-zone 【AZ_NAME_B】

それぞれのレスポンス中のSubnetIdLambdaとの紐付けに使うので、控えておきましょう。

セキュリティグループの作成

続いてセキュリティグループの作成を行います。
セキュリティグループについては公式ドキュメントには以下のような記載があります。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html

セキュリティグループは、インスタンスの仮想ファイアウォールとして機能し、インバウンドトラフィックとアウトバウンドトラフィックをコントロールします。VPC 内でインスタンスを起動した場合、そのインスタンスには最大 5 つのセキュリティグループを割り当てることができます。セキュリティグループは、サブネットレベルでなくインスタンスレベルで動作します。このため、VPC 内のサブネット内のインスタンスごとに異なるセキュリティグループのセットに割り当てることができます。

以下コマンドを実行してセキュリティグループを作成します。

aws ec2 create-security-group --group-name SecurityGroup1 --description "Security Group Sample1" --vpc-id 【VPC_ID】

レスポンスとして返ってくるGroupIdを控えておきましょう。

Lambda側の設定

あらかじめ任意のLambda関数は作成されているものとします。
今回はLambda関数名はvpcFunctionとします。

アクセス許可の追加が必要

自分の過去記事でも紹介したようにAWS CLIからLambda関数を作成することができます。

https://zenn.dev/nekoniki/articles/10ac0c37957cc9

ただ、このやり方をした場合はLambdaの実行ロール(というかそこに紐づくポリシー)にアクセス権限を追加する必要があります。

必要なのは以下の3種のアクセス許可です。

  • ec2:CreateNetworkInterface
  • ec2:DescribeNetworkInterfaces
  • ec2:DeleteNetworkInterface

※コンソールからLambda関数を作成し、かつその際の【詳細設定】でVPCを設定している場合はAWSLambdaVPCAccessExecutionRoleというポリシー名でデフォルトで付与されています

まずは必要なポリシー情報を記載したJSONを用意します。

vpc-access.json
{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
            "ec2:CreateNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DeleteNetworkInterface"
        ],
        "Resource": "*"
      }
    ]
}

このJSONを使って、Lambda関数のロール名を指定してポリシーを追加しましょう。
ポリシー名はvpc-accessとします。

ws iam put-role-policy --role-name 【ROLE_NAME】 --policy-name vpc-access --policy-document file://vpc-access.json

AWSのコンソールから対象のロールを参照した際に、vpc-accessという名前のポリシーが追加されていればOKです。

LambdaとVPCの紐付け

いよいよLambdaVPC内に含めます。
コマンドはupdate-function-configurationvpc-configオプションに先ほど作成したサブネットやセキュリティグループの情報を付与します。

aws lambda update-function-configuration --function-name vpcFunction --vpc-config SubnetIds=【SUBNET_ID_1】,【SUBNET_ID_2】,SecurityGroupIds=【SECURITY_GROUP_ID】

AWSのコンソールからvpcFunctionを参照し、【設定】タブの【VPC】の項目に上記で指定したサブネットやセキュリティグループが追加されていれば成功です。

まとめ

今回はVPCを作成して、その中にLambda関数を含める手順について紹介しました。

これでVPC内のリソースにLambdaからアクセスすることが可能になります。

ここで作成したものを利用して、次回はVPC内のAuroraインスタンスに対してLambdaからアクセスする方法について紹介していきたいと思います。

今回の内容が役立ちましたら幸いです。

Discussion