🏔️

AIエージェントでAWS環境へのアプリデプロイを15分で簡易体験 : Amazon Q Developer

所要時間: 約15分
難易度: 初級
対象者: 前編チュートリアルを完了し、Amazon Q Developer(IDE版)にアプリをAWSアカウント上にデプロイさせたい方

このチュートリアルで学べること

https://zenn.dev/aws_japan/articles/52162a2011fcab

↑こちらの前編記事で、ソフトウェア開発ライフサイクル(SDLC)の主要フェーズでAmazon Q Developerを活用する方法を体験しました。

  • コード理解 - @workspaceでプロジェクト全体を把握
  • 設計・実装 - /devで新機能追加(履歴機能)
  • テスト - /testでユニットテスト生成
  • レビュー・修正 - /reviewでセキュリティ脆弱性検出→自動修正
  • ドキュメント - /docでREADME生成

今回は以下を体験します。

  • デプロイ - 自然言語指示でAWSアカウントにデプロイ実行

以下の赤太字部分が前編記事の範囲で、今回の続編記事では青太字部分が体験できるイメージです。


前提条件

  • Visual Studio Code
  • Amazon Q Developer VS Code拡張機能がインストール済み
  • Python 3.7以上
  • デプロイ先となるAWSアカウントに、IAM Identity CenterユーザーまたはIAMユーザーでログインできること

ステップ1: AWS認証設定(初回のみ)

1-1. AWS CLIのインストール

aws --version

表示されない場合は公式ドキュメントからインストール。

1-2. AWS認証の設定

オプションA: SSO認証(推奨)
Amazon Q Developer Proを使用の場合は、以下の記事で紹介されているように、IAM Identity Centerが設定されており、SSO start URLなどの情報が取得できているはずです。

https://aws.amazon.com/jp/blogs/psa/getting-started-with-aws-iam-identity-center-for-amazon-q-developer-in-organizations/

aws configure sso

以下補足説明を参考にして入力(例):

SSO session name (Recommended): my-sso
# ↑ ローカルPCでの識別名(ニックネーム)。自分が分かりやすい名前を入力(例: work, my-company, dev-account)

SSO start URL [None]: https://my-sso-portal.awsapps.com/start
# ↑ SSOポータルURL。組織のIAM Identity Center管理者から教えてもらう

SSO region [None]: us-east-1
# ↑ IAM Identity Centerが設置されているリージョン。組織のIAM Identity Center管理者から教えてもらう

SSO registration scopes [None]: sso:account:access
# ↑ AWS CLIが要求する権限の範囲、普通のAWS CLI操作なら sso:account:access だけで十分

ブラウザが開くので、認証を完了してください。

その後、アカウントを選択:

There are 2 AWS accounts available to you.
> DeveloperAccount, developer-account-admin@example.com (123456789011) 
  ProductionAccount, production-account-admin@example.com (123456789022)
# ↑ あなたがアクセス権限を持っているAWSアカウントの一覧(例)。組織によって1個〜数十個まで様々。今回のデプロイ試行に使って良いアカウントを選択。

その後、ロールを選択:

Using the account ID 123456789011
There are 2 roles available to you.
> ReadOnly
  FullAccess
# ↑ 選択したアカウント内で、あなたに割り当てられているIAMロール(権限セット)(例)。組織によって名前や数は様々。今回のデプロイ試行に使って良いロールを選択。

その後、CLI設定:

CLI default client Region [None]: us-west-2
# ↑ AWS CLIコマンドを実行するデフォルトリージョン。今回デプロイしたいリージョンを選択する。

CLI default output format (json if not specified) [None]: json
# ↑ AWS CLIの出力形式。デフォルトのjsonでよい。

CLI profile name [123456789011_ReadOnly]: my-dev-profile
# ↑ このプロファイルの識別名(複数のAWS環境を使い分けるための「名札」)。自分が分かりやすい名前を入力(例: work-dev, my-company-prod)
# プロファイルが必要な理由:複数の環境を安全に使い分けるため。例: 開発環境と本番環境を使い分ける
#     aws s3 ls --profile dev   # 開発環境で作業
#     aws s3 ls --profile prod  # 本番環境を確認

完成した設定ファイルイメージ(~/.aws/config)

[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011      
sso_role_name = PowerUserAccess    
region = us-west-2                 
output = json                      

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access

ログイン時の使い方イメージ(profile指定することで上記環境でログインできる)

aws sso login --profile my-dev-profile

詳しい設定手順はこちらをご参照ください。

オプションB: IAMユーザー認証

※IAM Identity Center環境がないAmazon Q Developer Free(無料版)を使っている方など向けの説明。一時的な認証情報を使っておらず、アクセスキーが漏洩した際などに大きなセキュリティインシデントとなります。セキュリティリスクを避けるため、専用ソフトウェアの開発や実際のデータを扱うときは、IAM ユーザーを認証に使用しないでください、とAWS公式でメッセージングされている方法になります。

aws configure

以下を入力(例):

AWS Access Key ID: [あなたのアクセスキーID]
AWS Secret Access Key: [あなたのシークレットアクセスキー]
Default region name: us-east-1(などデプロイ先に指定したい任意のリージョン)
Default output format: json

詳しい設定手順はこちらをご参照ください。

※Amazon Q DeveloperにAWSアカウント上の操作をさせる方法は、AWSの公式MCPサーバーを使う方法など他にもありますが、基本的にはアカウント認証が済んでいる状態でAmazon Q Developerに操作依頼を出せばそれだけで操作してくれますので、今回はシンプルに認証のみの前提条件でデプロイを進めていきます。


ステップ2: ベストプラクティスの確認

前編記事calculator.pyファイルを作成済みの方は3~5の手順はスキップしてください。

  1. 任意の場所に新しいフォルダを作成(例: q-deploy-tutorial
  2. VS Codeでそのフォルダを開く(「ファイル」→「フォルダーを開く」)
  3. calculator.pyという名前で新規ファイルを作成
  4. 以下のコードをコピー&ペースト
  5. ファイルを保存(Cmd+S / Ctrl+S
calculator.py のコード(クリックして展開)
"""
シンプル計算機アプリケーション

注意: このコードには意図的にセキュリティ上の問題が含まれています。
eval()の使用は実際の開発では推奨されません。
"""


def calculate(expression):
    """
    数式を計算する
    
    注意: eval()を使用しているため、任意のPythonコードが実行される危険性があります。
    実際の開発では使用しないでください。
    
    Args:
        expression (str): 計算式(例: "2 + 3")
    
    Returns:
        float: 計算結果
    """
    # 注意: eval()の使用はセキュリティリスクがあります
    return eval(expression)


def main():
    """メイン関数"""
    print("=== シンプル計算機 ===")
    print("計算式を入力してください(例: 2 + 3)")
    print("終了するには 'q' を入力")
    
    while True:
        try:
            expression = input("\n> ").strip()
            
            if expression.lower() == 'q':
                print("終了します")
                break
            
            if not expression:
                continue
            
            result = calculate(expression)
            print(f"結果: {result}")
            
        except Exception as e:
            print(f"エラー: {e}")


if __name__ == "__main__":
    main()
  1. VS Code 左サイドバーの Amazon Q アイコン をクリック
  2. 「+ New tab」で新しいチャットを開始

以下を入力:

calculator.pyをAWS Lambdaにデプロイしたいです。
AWS Well-Architected Frameworkに沿って、以下の観点で推奨事項を教えてください:

- セキュリティ
- 信頼性
- パフォーマンス
- コスト最適化
- 運用性
実際の出力例(クリックして展開)
AWS Well-Architected Frameworkに基づく推奨事項

1. セキュリティ
- 重大な問題: eval()の使用は任意コード実行の脆弱性があります
- 推奨: ast.literal_eval()または数式パーサーライブラリ(numexpr、simpleeval)を使用
- IAM: Lambda実行ロールは最小権限の原則に従う
- 環境変数: 機密情報はAWS Secrets ManagerまたはParameter Storeを使用
- VPC: 外部リソースへのアクセスが必要な場合のみVPC内に配置

2. 信頼性
- エラーハンドリング: 入力検証とエラーレスポンスの標準化
- タイムアウト: 適切なタイムアウト設定(デフォルト3秒→計算に応じて調整)
- リトライ: 非同期呼び出しの場合、DLQ(Dead Letter Queue)を設定
- ロギング: CloudWatch Logsで詳細なログを記録

3. パフォーマンス
- メモリ設定: 128MB〜256MBで十分(計算処理は軽量)
- コールドスタート: グローバルスコープで初期化処理を配置
- 同時実行数: 予約済み同時実行数を設定してスロットリング制御
- アーキテクチャ: arm64(Graviton2)でコスト削減とパフォーマンス向上

4. コスト最適化
- メモリ: 必要最小限のメモリ設定(128MB推奨)
- タイムアウト: 短いタイムアウト設定で無駄な実行を防止
- アーキテクチャ: arm64で最大34%のコスト削減
- モニタリング: AWS Cost ExplorerとBudgetsで使用状況を監視

5. 運用性
- IaC: AWS SAM、Terraform、CDKでインフラをコード化
- CI/CD: GitHub Actions、CodePipelineで自動デプロイ
- モニタリング: CloudWatch Metrics、X-Rayでトレーシング
- バージョニング: Lambda関数のバージョンとエイリアスを活用

ステップ3: Lambda関数の作成とデプロイ

3-1. デプロイ指示(プロンプト例)

aws cliコマンドを使ってcalculator.pyをLambdaにデプロイしてください。
テストは後ほど実行するのでまだ不要です。
先ほどのWell-Architected Framework推奨事項に沿ってデプロイして欲しいですが、
今回はただの簡易お試しデプロイなのでコストをかけず、セキュリティを担保した最小限のデプロイとしたいです。
デプロイするリソースはLambdaと、Lambda実行ロール付与のために関連するIAMのみの最小限、ということを厳守してください。
関数名はcalculator-functionで、Python 3.11を使います。
現在認証されているAWSアカウントのデフォルトリージョンにデプロイしてください。
実際の出力例(クリックして展開)
Lambda用にcalculator.pyを修正し、AWS CLIでデプロイします。

実行手順:
1. Lambda handler関数を追加
2. セキュアな数式評価に変更(eval()を排除)
3. IAMロールを作成
4. デプロイパッケージを作成
5. Lambda関数をデプロイ

Lambda用のハンドラー関数を作成し、eval()の代わりに制限付き評価を使用してセキュリティを向上

lambda_function.py
+43
-0

Lambda関数のデプロイパッケージ(zipファイル)を作成
✓ Completed
zip -q lambda_function.zip lambda_function.py && ls -lh lambda_function.zip
-rw-r--r--  1 user  staff   731B Oct 21 15:16 lambda_function.zip

Lambda実行ロール用の信頼ポリシーを作成

trust-policy.json
+12
-0

IAMロールを作成
✓ Completed
aws iam create-role --role-name calculator-lambda-role --assume-role-policy-document file://trust-policy.json --query 'Role.Arn' --output text
arn:aws:iam::123456789012:role/calculator-lambda-role

基本的なLambda実行権限(CloudWatch Logsへの書き込み)をロールにアタッチ
✓ Completed
aws iam attach-role-policy --role-name calculator-lambda-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

IAMロールの伝播を待機(10秒)してからLambda関数を作成
✓ Completed
echo "IAMロールの伝播を待機中..." && sleep 10 && aws lambda create-function \
  --function-name calculator-function \
  --runtime python3.11 \
  --role arn:aws:iam::123456789012:role/calculator-lambda-role \
  --handler lambda_function.lambda_handler \
  --zip-file fileb://lambda_function.zip \
  --timeout 10 \
  --memory-size 128 \
  --architectures arm64 \
  --query '{FunctionName:FunctionName, Runtime:Runtime, Handler:Handler, MemorySize:MemorySize, Timeout:Timeout, Architectures:Architectures[0]}' \
  --output table

-----------------------------------------------------
|                  CreateFunction                   |
+----------------+----------------------------------+
|  Architectures |  arm64                           |
|  FunctionName  |  calculator-function             |
|  Handler       |  lambda_function.lambda_handler  |
|  MemorySize    |  128                             |
|  Runtime       |  python3.11                      |
|  Timeout       |  10                              |
+----------------+----------------------------------+

✅ デプロイ完了
Lambda関数 calculator-function を us-east-1 リージョンにデプロイしました。

デプロイ内容:
- 関数名: calculator-function
- ランタイム: Python 3.11
- アーキテクチャ: arm64(コスト最適化)
- メモリ: 128MB(最小限)
- タイムアウト: 10秒
- IAMロール: calculator-lambda-role(CloudWatch Logs書き込み権限のみ)

セキュリティ改善点:
- eval()を制限付き評価に変更(数式と数値のみ許可)
- 入力検証を追加(正規表現チェック)
- エラーハンドリングを実装

作成されたリソース:
- Lambda関数: calculator-function
- IAMロール: calculator-lambda-role
- ローカルファイル: lambda_function.py, lambda_function.zip, trust-policy.json

あなたがやること:

  • 各ステップで実行承認(画面に表示される実行ボタンをクリック)
  • エラーが出たら指示に従う

3-2. デプロイ確認

calculator-functionで以下をテストしてください:
- 10 * 5
- 100 / 4
実際の出力例(クリックして展開)
10 * 5 の計算をテスト
✓ Completed
aws lambda invoke --function-name calculator-function --payload '{"expression": "10 * 5"}' --cli-binary-format raw-in-base64-out response1.json && cat response1.json && echo ""
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{"statusCode": 200, "body": "{\"expression\": \"10 * 5\", \"result\": 50}"}

100 / 4 の計算をテスト
✓ Completed
aws lambda invoke --function-name calculator-function --payload '{"expression": "100 / 4"}' --cli-binary-format raw-in-base64-out response2.json && cat response2.json && echo ""
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{"statusCode": 200, "body": "{\"expression\": \"100 / 4\", \"result\": 25.0}"}

✅ テスト結果
両方のテストが成功しました:

計算式    結果    ステータス
10 * 5    50      ✅ 成功
100 / 4   25.0    ✅ 成功

Lambda関数は正常に動作しています。

ステップ4: クリーンアップ

今回デプロイしたリソース群を削除したいです。
削除する前にリストを提示して、私に確認させてください。
確認後、問題なければ削除指示を出します。
実際の出力例(クリックして展開)
削除対象のAWSリソースを確認します。

Lambda関数の存在を確認
✓ Completed
aws lambda get-function --function-name calculator-function --query 'Configuration.[FunctionName,FunctionArn,Runtime,MemorySize]' --output table
------------------------------------------------------------------------
|                              GetFunction                             |
+----------------------------------------------------------------------+
|  calculator-function                                                 |
|  arn:aws:lambda:us-east-1:123456789012:function:calculator-function  |
|  python3.11                                                          |
|  128                                                                 |
+----------------------------------------------------------------------+

IAMロールの存在とアタッチされているポリシーを確認
✓ Completed
aws iam get-role --role-name calculator-lambda-role --query 'Role.[RoleName,Arn,CreateDate]' --output table
-----------------------------------------------------------
|                         GetRole                         |
+---------------------------------------------------------+
|  calculator-lambda-role                                 |
|  arn:aws:iam::123456789012:role/calculator-lambda-role  |
|  2025-10-21T06:16:47+00:00                              |
+---------------------------------------------------------+

=== アタッチされているポリシー ===
--------------------------------------------------------------------------------------
|                              ListAttachedRolePolicies                              |
+------------------------------------------------------------------------------------+
||                                 AttachedPolicies                                 ||
|+------------+---------------------------------------------------------------------+|
||  PolicyArn |  arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole   ||
||  PolicyName|  AWSLambdaBasicExecutionRole                                        ||
|+------------+---------------------------------------------------------------------+|

削除対象リソース一覧

AWSリソース(2件)
#  リソースタイプ  リソース名                ARN/詳細
1  Lambda関数      calculator-function       arn:aws:lambda:us-east-1:123456789012:function:calculator-function
2  IAMロール       calculator-lambda-role    arn:aws:iam::123456789012:role/calculator-lambda-role
                                             (AWSLambdaBasicExecutionRole ポリシーがアタッチ済み)

ローカルファイル(4件)
- lambda_function.py
- lambda_function.zip
- trust-policy.json
- response1.json, response2.json(テスト結果)

削除手順:
1. Lambda関数を削除
2. IAMロールからポリシーをデタッチ
3. IAMロールを削除
4. (オプション)ローカルファイルを削除

削除を実行してよろしいですか?
問題なければ「削除してください」とご指示ください。

あなたがやること:

(※実際に確認して問題なければ)削除してください
実際の出力例(クリックして展開)
Lambda関数を削除
✓ Completed
aws lambda delete-function --function-name calculator-function && echo "✅ Lambda関数を削除しました"
✅ Lambda関数を削除しました

IAMロールからポリシーをデタッチ
✓ Completed
aws iam detach-role-policy --role-name calculator-lambda-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole && echo "✅ IAMポリシーをデタッチしました"
✅ IAMポリシーをデタッチしました

IAMロールを削除
✓ Completed
aws iam delete-role --role-name calculator-lambda-role && echo "✅ IAMロールを削除しました"
✅ IAMロールを削除しました

ローカルファイルを削除
✓ Completed
rm -f lambda_function.py lambda_function.zip trust-policy.json response1.json response2.json && echo "✅ ローカルファイルを削除しました"
✅ ローカルファイルを削除しました

✅ 削除完了
すべてのリソースを削除しました。

削除されたリソース:
リソース              名前                              ステータス
Lambda関数            calculator-function               ✅ 削除済み
IAMポリシー           AWSLambdaBasicExecutionRole       ✅ デタッチ済み
IAMロール             calculator-lambda-role            ✅ 削除済み
ローカルファイル      lambda_function.py, ...           ✅ 削除済み

元の calculator.py のみが残っています。

まとめ

このチュートリアルで体験したこと:

  1. 「Well-Architected Frameworkの推奨事項を教えて」 → ベストプラクティスを確認
  2. 「calculator.pyをLambdaにデプロイして」 → AWS認証確認 → コード生成 → IAM作成 → デプロイ実行
  3. 「リソースを削除して」 → 削除対象確認 → クリーンアップ完了

AIエージェント開発フロー:

前編記事で開発したアプリを、AWSアカウント上にデプロイするところまでの手順を短時間で簡易体験できました。


アマゾン ウェブ サービス ジャパン (有志)

Discussion