AWS API Gateway + Lambda(node.js)でセキュリティグループのマイIPを更新する方法

AWS Lambda(node.js)でセキュリティグループのマイIPを更新する方法

リモートワークが増えてきたので、自宅のPC環境からAWSのサービスに接続したいという場合、インバウンドルールにマイIPを設定すると思います。

自宅のルータを再起動したりするとグローバルIPが変わってしまったりする場合があるので、毎回セキュリティグループのインバウンドのマイIPを設定しないといけません。これが面倒なのでAPIでマイIPを更新するAPI Gateway + Lambdaを作成してみました。

マイIPは、http://checkip.amazonaws.comにGETメソッドでアクセスすれば取得できます。が、こちらLambda上でsuperagentなどで叩くと、Lambdaが動作するEC2のアドレスを返します。(試しにEC2にログインしてcurl -X GET http://checkip.amazonaws.comするとわかります)

一旦はマネジメントコンソールからセキュリティグループを作成しているものとします。(セキュリティグループIDを把握している)

revokeSecurityGroupIngressメソッドでインバウンドルールを削除する

revokeSecurityGroupIngressメソッドで一旦セキュリティグループのインバウンドルールを削除します。

削除するLambda例です。

const AWS = require('aws-sdk')
AWS.config.update({ region: 'ap-northeast-1' })
const ec2 = new AWS.EC2({ apiVersion: '2016-11-15' })
exports.handler = async (event) => {
const params = {
GroupId: "sg-0a4bgh87c26a497654", // セキュリティグループID
IpPermissions: [
{
FromPort: 22,
IpProtocol: "tcp",
IpRanges: [
{
CidrIp: "50.55.111.82/32" // マイIP
}
],
ToPort: 22
}
]
}
await ec2.revokeSecurityGroupIngress(params).promise()
const response = {
statusCode: 200,
body: JSON.stringify('OK'),
}
return response
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

現在のマイIPを取得する

Lambda(node.js)はEC2上で動作していますので、Lambda(node.js)で現在のマイIPを取得するのは無理です。(多分)

ということでAPI Gatewayからクエリパラメータで渡す仕様とします。

https://example.com/xxx/?deleteip=66.66.66.xx&currentip=66.66.66.yy ※こんなREST APIのイメージ

authorizeSecurityGroupIngressメソッドでインバウンドルールを作成する

authorizeSecurityGroupIngressメソッドで一旦セキュリティグループのインバウンドルールを作成します。

作成するLambda例です。

const AWS = require('aws-sdk')
AWS.config.update({ region: 'ap-northeast-1' })
const ec2 = new AWS.EC2({ apiVersion: '2016-11-15' })
exports.handler = async (event) => {
const params = {
GroupId: "sg-0a4bgh87c26a497654", // セキュリティグループID
IpPermissions: [
{
FromPort: 22,
IpProtocol: "tcp",
IpRanges: [
{
CidrIp: "50.55.111.82/32",// マイIP
Description: "setumei desu"
}
],
ToPort: 22
}
]
}
await ec2.authorizeSecurityGroupIngress(params).promise()
const response = {
statusCode: 200,
body: JSON.stringify('OK'),
};
return response;
};

view raw
gistfile1.txt
hosted with ❤ by GitHub

マイIPを更新するAPIを作成する

API Gatewayはクエリ文字列にcurrentipdeleteipを指定して、「Lambdaプロキシ統合の使用」にチェックを入れます。最後にLambdaを作成します。IPを間違えた場合などは考慮してません。

AWS API Gateway + Lambda(node.js)でセキュリティグループのマイIPを更新する方法

Lambda例です。

const AWS = require('aws-sdk')
AWS.config.update({ region: 'ap-northeast-1' })
const ec2 = new AWS.EC2({ apiVersion: '2016-11-15' })
exports.handler = async (event) => {
const securityGroup = "sg-0a4bgh87c26a497654" // セキュリティグループID
const deleteip = event.queryStringParameters.deleteip
const currentip = event.queryStringParameters.currentip
const params = (securityGroup, ip) => {
return {
GroupId: securityGroup,
IpPermissions: [
{
FromPort: 22,
IpProtocol: "tcp",
IpRanges: [
{
CidrIp: ip + "/32",
Description: "setumei desu"
}
],
ToPort: 22
}
]
}
}
const p1 = ec2.revokeSecurityGroupIngress(params(securityGroup, deleteip)).promise().catch(()=>console.log('削除失敗'))
const p2 = ec2.authorizeSecurityGroupIngress(params(securityGroup, currentip)).promise().catch(()=>console.log('作成失敗'))
await Promise.all([p1, p2])
const response = {
statusCode: 200,
body: JSON.stringify(currentip),
};
return response
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

curlコマンドです。

curl -X GET https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v1/?deleteip=60.66.193.82\&currentip=60.66.193.10

You are not authorized to perform this operation.

Lambda実行時に「You are not authorized to perform this operation.」が出たら、EC2へのアクセス権限が足りてません。

参考サイト

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA