目次
はじめに
こんにちは、ディーネットの山田です。
2024年10月10日にAWSコンソールアクションを再利用可能なコードに変換できる、AWS Console-to-Code の一般提供が開始されたので、試してみた。
AWS コンソールアクションを再利用可能なコードに変換する AWS Console-to-Code の一般提供を開始
利用可能なサービスについて
現在、利用可能なサービスについては以下の3種類のみのようです。
- Amazon EC2
- Amazon VPC
- Amazon RDS
Automating AWS services with Amazon Q Developer Console-to-Code
作業手順
今回は、例題としてセキュリティグループの操作を記録させて、コード化を試してみた結果となります。
AWS コンソールを開く
利用可能なサービスの AWS コンソールを開いてください。
Console-to-Code の機能を開いて記録を開始
利用可能なサービスの AWS コンソールを開いてください。
「記録を開始」をクリックしてください。
対象サービスの AWS コンソールで目的としたい操作を実施
利用可能なサービスの AWS コンソールを開いてください。
今回は、セキュリティグループで HTTP(80) と HTTPS(443) のポートに対して Any 開放を実施しました。
Console-to-Code で目的の操作が完了したら、記録を停止
「停止」をクリックしてください。
Console-to-Code で記録されたアクションを選択し、コード化を実施
目的の操作にチェックを入れて、「CFN YAML を生成」もしくは「CLI をコピー」をすることで、コンソールで実行された操作が、コード化されます。
Console-to-Code で記録されたアクションを選択し、CLIコード化を実施
「CLI をコピー」であれば以下のような結果が出力されます。
aws ec2 authorize-security-group-ingress --group-id "sg-12345678901234567" --ip-permissions '{"FromPort":80,"ToPort":80,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"0.0.0.0/0","description":"HTTP Allow Any"}]}' '{"FromPort":443,"ToPort":443,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"0.0.0.0/0","description":"HTTPS Allow Any"}]}'
Console-to-Code で記録されたアクションを選択し、CFN YAMLコード化を実施
「CFN YAML を生成」であれば以下のような結果が出力されます。
Resources:
WebServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupId: sg-12345678901234567
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Description: HTTP Allow Any
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Description: HTTPS Allow Any
Reasoning: {The provided AWS CLI command authorizes ingress traffic to a security group with the ID "sg-12345678901234567" for ports 80 (HTTP) and 443 (HTTPS) from any IP address (0.0.0.0/0). The generated CloudFormation YAML code creates an AWS::EC2::SecurityGroup resource with the specified GroupId and SecurityGroupIngress rules that allow inbound HTTP and HTTPS traffic from any IP address. The IpProtocol, FromPort, ToPort, CidrIp, and Description properties are mapped directly from the CLI command input.}
生成された CLI を実際に CloudShell で実行
CloudShell で生成された CLI を実行します。
[cloudshell-user@ip-10-132-77-76 ~]$ aws ec2 authorize-security-group-ingress --group-id "sg-12345678901234567" --ip-permissions '{"FromPort":80,"ToPort":80,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"0.0.0.0/0","description":"HTTP Allow Any"}]}' '{"FromPort":443,"ToPort":443,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"0.0.0.0/0","description":"HTTPS Allow Any"}]}'
Parameter validation failed:
Unknown parameter in IpPermissions[0].IpRanges[0]: "description", must be one of: Description, CidrIp
Unknown parameter in IpPermissions[1].IpRanges[0]: "description", must be one of: Description, CidrIp
エラーが発生してしまいました。
AWS らしく、Bedrock の Claude 3.5 Sonnet にお願いして、コマンドを修正してもらいました。
- プロンプト
AWS Console-to-Code で生成されたCLIを実行したところ、エラーが発生しました。
原因の調査報告と修正を行って下さい。
[cloudshell-user@ip-10-132-77-76 ~]$ aws ec2 authorize-security-group-ingress --group-id "sg-12345678901234567" --ip-permissions '{"FromPort":80,"ToPort":80,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"0.0.0.0/0","description":"HTTP Allow Any"}]}' '{"FromPort":443,"ToPort":443,"IpProtocol":"tcp","IpRanges":[{"CidrIp":"0.0.0.0/0","description":"HTTPS Allow Any"}]}'
Parameter validation failed:
Unknown parameter in IpPermissions[0].IpRanges[0]: "description", must be one of: Description, CidrIp
Unknown parameter in IpPermissions[1].IpRanges[0]: "description", must be one of: Description, CidrIp
- Claude 3.5 Sonnet からの回答
このエラーは、AWS CLI コマンドの構文に関する問題が原因で発生しています。具体的には、以下の2つの問題があります:
1. `IpPermissions` パラメータの構造が正しくありません。
2. `description` パラメータが小文字で指定されていますが、正しくは `Description` (大文字で始まる)です。
修正したコマンドは以下のようになります:
aws ec2 authorize-security-group-ingress --group-id "sg-12345678901234567" --ip-permissions '[
{
"FromPort": 80,
"ToPort": 80,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0",
"Description": "HTTP Allow Any"
}
]
},
{
"FromPort": 443,
"ToPort": 443,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0",
"Description": "HTTPS Allow Any"
}
]
}
]'
主な変更点:
1. `IpPermissions` パラメータを1つの JSON 配列としてまとめました。
2. `description` を `Description` に変更しました。
3. JSON 構造を正しく整形しました。
この修正されたコマンドを実行すると、エラーなく Security Group のルールが追加されるはずです。
注意:セキュリティ上の理由から、本番環境では "0.0.0.0/0" (すべての IP からのアクセスを許可)の使用は推奨されません。可能な限り、アクセスを必要な IP 範囲に制限することをお勧めします。
Claude 3.5 Sonnet に修正してもらったコマンドを再度 CloudShell で実行
- 修正してもらった CLI の内容
aws ec2 authorize-security-group-ingress --group-id "sg-12345678901234567" --ip-permissions '[
{
"FromPort": 80,
"ToPort": 80,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0",
"Description": "HTTP Allow Any"
}
]
},
{
"FromPort": 443,
"ToPort": 443,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0",
"Description": "HTTPS Allow Any"
}
]
}
]'
- 結果
問題なく追加できました。
[cloudshell-user@ip-10-132-77-76 ~]$ aws ec2 authorize-security-group-ingress --group-id "sg-12345678901234567" --ip-permissions '[
{
"FromPort": 80,
"ToPort": 80,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0",
"Description": "HTTP Allow Any"
}
]
},
{
"FromPort": 443,
"ToPort": 443,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0",
"Description": "HTTPS Allow Any"
}
]
}
]'
{
"Return": true,
"SecurityGroupRules": [
{
"SecurityGroupRuleId": "sgr-12345678901234567",
"GroupId": "sg-12345678901234567",
"GroupOwnerId": "123456789012",
"IsEgress": false,
"IpProtocol": "tcp",
"FromPort": 80,
"ToPort": 80,
"CidrIpv4": "0.0.0.0/0",
"Description": "HTTP Allow Any"
},
{
"SecurityGroupRuleId": "sgr-12345678901234567",
"GroupId": "sg-12345678901234567",
"GroupOwnerId": "123456789012",
"IsEgress": false,
"IpProtocol": "tcp",
"FromPort": 443,
"ToPort": 443,
"CidrIpv4": "0.0.0.0/0",
"Description": "HTTPS Allow Any"
}
]
}
まとめ
- AWS Console-to-Code 機能を使って、AWS マネジメントコンソールでの操作を コード化 することができました。
- テストケースが悪かったのか、正確性には疑問が残る形だったのであくまで補助ツールとして使うのがよいのかなと思いました。
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ