今から始めるLambda⑤「VPC内に配置する」
はじめに
前回の記事ではLambda
とAPI Gateway
を組み合わせてREST API
を作成する手順について紹介しました。
今回はあらかじめ作成したLambda
を、新たに作成したVPC
内に配置する手順について紹介します。
VPCとは
Amazon Virtual Private Cloud (VPC) では、リソースの配置、接続性、セキュリティなど、仮想ネットワーク環境を完全に制御することができます。最初のステップは、VPC を作成することです。次に、Amazon Elastic Compute Cloud (EC2) や Amazon Relational Database Service (RDS) インスタンスなどのリソースを追加できます。最後に、アカウント、アベイラビリティーゾーン (AZ)、リージョンを超えて、VPC 同士の通信方法を定義することができます。以下の例では、各リージョン内の 2 つの VPC 間でネットワークトラフィックを共有しています。
Lambda
をVPC
内に配置する目的としては、同じく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/24
と10.0.1.0/24
という2種類のサブネットを追加します。
ついでにAZ
も分けておきます。
自分の場合はus-east-2
リージョンだったので、us-east-2a
とus-east-2b
のAZ
を指定しました。
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】
それぞれのレスポンス中のSubnetId
をLambda
との紐付けに使うので、控えておきましょう。
セキュリティグループの作成
続いてセキュリティグループの作成を行います。
セキュリティグループについては公式ドキュメントには以下のような記載があります。
セキュリティグループは、インスタンスの仮想ファイアウォールとして機能し、インバウンドトラフィックとアウトバウンドトラフィックをコントロールします。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
関数を作成することができます。
ただ、このやり方をした場合はLambda
の実行ロール(というかそこに紐づくポリシー)にアクセス権限を追加する必要があります。
必要なのは以下の3種のアクセス許可です。
- ec2:CreateNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DeleteNetworkInterface
※コンソールからLambda
関数を作成し、かつその際の【詳細設定】でVPC
を設定している場合はAWSLambdaVPCAccessExecutionRole
というポリシー名でデフォルトで付与されています
まずは必要なポリシー情報を記載した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の紐付け
いよいよLambda
をVPC
内に含めます。
コマンドはupdate-function-configuration
でvpc-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