ハンズオン: グローバルインフラストラクチャ & API ~AWS認定デベロッパーアソシエイト(DCA-C02)~
このブログは2026年6月29日翔泳社さんより発売される「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集」で扱う内容を体験していただくためのハンズオンガイドです。
このハンズオンガイドは、AWSのグローバルインフラストラクチャ(リージョン、AZ)を意識しながら EC2 インスタンスを起動する操作を、マネジメントコンソール、AWS CLI、Python boto3、署名バージョン4のそれぞれの方法で体験する手順です。
目次
準備:最小権限IAM ポリシーの作成とアタッチ
まず準備としてこのハンズオンで使用するIAMユーザー、またはIAMロールを作成してください。
個別に作成する必要のない方はこの準備はスキップして進めてください。
ハンズオンで使用するIAMユーザーまたはIAMロールに、以下の最小権限ポリシーをアタッチします。
必要な権限の概要
- EC2 インスタンスの起動・確認・終了、AMIの参照
- CloudShell の使用
IAM ポリシーの JSON
以下のポリシーをカスタム管理ポリシーとして作成してアタッチ、またはインラインポリシーとして作成します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EC2Operations", "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:DescribeInstances", "ec2:DescribeImages", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeKeyPairs", "ec2:DescribeAvailabilityZones", "ec2:DescribeInstanceTypes", "ec2:DescribeVpcs", "ec2:CreateTags", "ec2:TerminateInstances", "ec2:GetSecurityGroupsForVpc" ], "Resource": "*" }, { "Sid": "CloudShellAccess", "Effect": "Allow", "Action": [ "cloudshell:*" ], "Resource": "*" } ] } |
A. カスタム管理ポリシーとしてアタッチする場合
- マネジメントコンソールで[IAM]にアクセス。
- 左メニューの [ポリシー]-[ポリシーの作成]をクリック。
- [JSON]タブを選択し、上記のポリシーを貼り付ける。
- ポリシー名を任意の名前で保存する。
- [ユーザー]または[ロール]を開き、ハンズオンで使用する対象を選択して[アクセス許可を追加]→[ポリシーをアタッチ]から作成したポリシーをアタッチする。
B. インラインポリシーとして追加する場合
- マネジメントコンソールで[IAM]にアクセス。
- [ユーザー]または[ロール]を開き、ハンズオンで使用する対象を選択する。
- [アクセス許可]タブ-[インラインポリシーを追加]をクリック。
- [JSON]タブを選択し、上記のポリシーを貼り付ける。
- ポリシー名に任意の名前を付けて保存する。
動作確認
ポリシーをアタッチしたIAMユーザーまたはIAMロールでCloudShellにアクセスして、以下を実行して権限エラーが出ないことを確認してから各タスクに進む。
|
1 2 3 |
aws sts get-caller-identity aws ec2 describe-availability-zones --region ap-northeast-1 --query "AvailabilityZones[*].ZoneName" --output table |
タスク 1:マネジメントコンソールにサインインしてリージョンを確認・切り替える
目的
リージョンを確認しましょう。
手順
- 画面右上のリージョン表示(例: 米国(バージニア北部))をクリックする。
- ドロップダウンにさまざまなリージョンがあることを確認する。
- 東京 ap-northeast-1を選択して東京リージョンに切り替える。
ポイント
- AWSのリージョンサービスを使うとき、最初に選択するのがリージョンです。
- サービスやデータの地域を限定できます。
- CloudFront、Route 53などのエッジロケーションを使用しているグローバルサービスは、リージョン選択は不要です。
タスク 2:マネジメントコンソールから EC2 インスタンスを起動する
目的
リージョン、AZ(アベイラビリティゾーン)を意識しながら、マネジメントコンソールの操作でEC2インスタンスを起動します。
手順
- マネジメントコンソール上部の検索フィールドに EC2と入力し、EC2コンソールにアクセスします。
- 左メニューから [インスタンス]-[インスタンスを起動]をクリック。
- 以下の設定を行う:
| 項目 | 設定値(例) |
|---|---|
| 名前 | handson-console |
| AMI | Amazon Linux 2023 AMI |
| インスタンスタイプ | t3.micro |
| キーペア | 「キーペアなしで続行」 |
| ネットワーク設定-VPC | デフォルト |
| ネットワーク設定-サブネット | ap-northeast-1a を選択 |
| パブリックIPの自動割り当て | 無効化 |
| 既存のセキュリティグループを選択する | default |
- [インスタンスを起動] ボタンをクリック。
- インスタンス一覧に戻り、状態が 実行中(running) になることを確認する。
- インスタンスの[ネットワーキング]タブで アベイラビリティゾーンが ap-northeast-1aになっていることを確認する。
いくつかの表示エラーメッセージがありますが、これは権限がないだけですので問題ありません。
マネジメントコンソールからEC2インスタンスを起動するために、必要な権限をIAMポリシーで設定しています。
「You are not authorized to perform this operation. User: arn:aws:sts::123456789012:assumed-role/0handson/yamashita is not authorized to perform: ec2:DescribeVolumes because no identity-based policy allows the ec2:DescribeVolumes action」
例えば上記のメッセージは0handsonというIAMロールにはec2:DescribeVolumesというAPIアクションの権限が、アイデンティティベースのポリシーで許可されていないことを示しています。
ポイント
- EC2インスタンスは起動時に1つのAZを選択して起動します。
- 複数AZに冗長化する場合はそれぞれのAZに起動したり、オートスケーリングを使います。
- マネジメントコンソールからの操作もAPIアクションが実行されています。
タスク 3:CloudShellを起動してAWS CLIでEC2インスタンスを起動する
目的
AWS CLIコマンドでEC2インスタンスを起動する。
手順
- マネジメントコンソール右上の CloudShell アイコン(
>_)を右クリックして CloudShellを新しいタブなど別のタブで起動します。または上部検索フィールドに「CloudShell」と入力してアクセスします。 -
CloudShellが起動したら、現在の認証情報を確認します。
|
1 2 |
aws sts get-caller-identity |
認証情報が表示されるので確認します。
- 利用可能な AMI IDを確認します。(Amazon Linux 2023 の最新 AMI)
|
1 2 3 4 5 6 7 8 9 10 |
AMI_ID=$(aws ec2 describe-images \ --owners amazon \ --filters "Name=name,Values=al2023-ami-*-x86_64" \ "Name=state,Values=available" \ --query "sort_by(Images, &CreationDate)[-1].ImageId" \ --output text \ --region ap-northeast-1) echo $AMI_ID |
- 取得した AMI ID を使って EC2 インスタンスを起動します。
|
1 2 3 4 5 6 7 8 9 |
aws ec2 run-instances \ --image-id $AMI_ID \ --instance-type t3.micro \ --count 1 \ --placement AvailabilityZone=ap-northeast-1a \ --no-associate-public-ip-address \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=handson-cli}]' \ --region ap-northeast-1 |
起動リクエストを受け付けて、EC2インスタンスの詳細などが表示されます。
[Q]キーで表示を中断できます。
- 起動したインスタンスの ID と AZ を確認する:
|
1 2 3 4 5 6 |
aws ec2 describe-instances \ --filters "Name=tag:Name,Values=handson-cli" \ --query "Reservations[*].Instances[*].[InstanceId,Placement.AvailabilityZone,State.Name]" \ --output table \ --region ap-northeast-1 |
次のような結果が表示されます。
–output tableとしているので、表形式で表示されています。
| DescribeInstances |
+———————+——————-+————–+
| i-071c0d5870d2cb9ea| ap-northeast-1a | running |
+———————+——————-+————–+
ポイント
- CloudShell はマネジメントコンソールにサインインしている IAM ユーザーの認証情報を自動的に使用するため、認証情報の設定が不要です。
- CLIコマンドもマネジメントコンソールと同様にAWS APIアクションを呼び出しています。
タスク 4:CloudShellでPython boto3を使ってEC2インスタンスを起動する
目的
AWS SDK(Python boto3)を使って、プログラムからEC2インスタンスを起動します。
手順
- CloudShell で Python3 が使えることを確認する:
|
1 2 3 |
python3 --version pip3 show boto3 |
Pythonのバージョン、SDK(boto3)の情報が表示されます。
- インラインで Python スクリプトを作成・実行する:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
python3 << 'EOF' import boto3 # EC2 クライアントを作成(東京リージョン) client = boto3.client('ec2', region_name='ap-northeast-1') # 最新の Amazon Linux 2023 AMI ID を取得 response = client.describe_images( Owners=['amazon'], Filters=[ {'Name': 'name', 'Values': ['al2023-ami-*-x86_64']}, {'Name': 'state', 'Values': ['available']}, ] ) images = sorted(response['Images'], key=lambda x: x['CreationDate'], reverse=True) ami_id = images[0]['ImageId'] print(f"使用するAMI ID: {ami_id}") vpcs = client.describe_vpcs(Filters=[{'Name': 'is-default', 'Values': ['true']}]) vpc_id = vpcs['Vpcs'][0]['VpcId'] sgs = client.describe_security_groups( Filters=[{'Name': 'vpc-id', 'Values': [vpc_id]}, {'Name': 'group-name', 'Values': ['default']}]) sg_id = sgs['SecurityGroups'][0]['GroupId'] # EC2 インスタンスを起動 response = client.run_instances( ImageId=ami_id, MinCount=1, MaxCount=1, InstanceType='t3.micro', NetworkInterfaces=[{ 'DeviceIndex': 0, 'AssociatePublicIpAddress': False, 'Groups': [sg_id], }], Placement={'AvailabilityZone': 'ap-northeast-1c'}, TagSpecifications=[{ 'ResourceType': 'instance', 'Tags': [{'Key': 'Name', 'Value': 'handson-boto3'}] }] ) instance = response['Instances'][0] print(f"起動したインスタンス ID: {instance['InstanceId']}") print(f"AZ: {instance['Placement']['AvailabilityZone']}") print(f"状態: {instance['State']['Name']}") EOF |
以下のような情報が表示されれば成功です。
使用するAMI ID: ami-04d11c012a67b33a4
起動したインスタンス ID: i-081f9e2aa404e052c
AZ: ap-northeast-1c
状態: pending
- マネジメントコンソールの EC2 インスタンス一覧で
handson-boto3が起動していることを確認します。
ポイント
- boto3は AWSのPython SDKです。CloudShellにはプリインストールされているためインストール不要です。
- CloudShellのIAM 認証情報を自動的に使用するため、認証情報の設定が不要です。
タスク 5:CloudShell から署名バージョン4を使って EC2 インスタンスを起動する
目的
AWS APIの署名バージョン4(SigV4)を手動で構築し、HTTPリクエストを直接送信してEC2インスタンスを起動する仕組みを体験します。
概要
マネジメントコンソール・CLI・SDK はすべて、最終的に署名バージョン4で署名されたHTTPリクエストをAWS APIエンドポイントに送信しています。このタスクではPythonで署名を手動作成し、その仕組みを理解します。
署名バージョン4の4ステップ
- 正規リクエストを作成
- 正規リクエストと追加メタデータを使って署名の文字列を作成
- AWS シークレットアクセスキーから署名キーを取得し、署名を作成
- 作成した署名を Authorizationヘッダーまたはクエリパラメータに追加
手順
- CloudShell で Python スクリプトファイルを作成する:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
cat > ~/sigv4_ec2_launch.py << 'EOF' import boto3 import hashlib import hmac import datetime import urllib.request import urllib.parse import json # ------------------------------------------------------- # CloudShell の一時認証情報を boto3 経由で取得 # ------------------------------------------------------- session = boto3.Session(region_name='ap-northeast-1') credentials = session.get_credentials().get_frozen_credentials() ACCESS_KEY = credentials.access_key SECRET_KEY = credentials.secret_key SESSION_TOKEN = credentials.token # 一時認証情報の場合は必須 REGION = 'ap-northeast-1' SERVICE = 'ec2' HOST = f'ec2.{REGION}.amazonaws.com' ENDPOINT= f'https://{HOST}/' # ------------------------------------------------------- # 起動するAMI IDを取得(最新のAmazon Linux 2023) # ------------------------------------------------------- ec2_client = session.client('ec2') response = ec2_client.describe_images( Owners=['amazon'], Filters=[ {'Name': 'name', 'Values': ['al2023-ami-*-x86_64']}, {'Name': 'state', 'Values': ['available']}, ] ) images = sorted(response['Images'], key=lambda x: x['CreationDate'], reverse=True) AMI_ID = images[0]['ImageId'] print(f"使用するAMI ID: {AMI_ID}") # ------------------------------------------------------- # 署名バージョン4 ヘルパー関数 # ------------------------------------------------------- def sign(key, msg): return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest() def get_signature_key(secret_key, date_stamp, region, service): k_date = sign(('AWS4' + secret_key).encode('utf-8'), date_stamp) k_region = sign(k_date, region) k_service = sign(k_region, service) k_signing = sign(k_service, 'aws4_request') return k_signing # ------------------------------------------------------- # Step 1: 日時の準備 # ------------------------------------------------------- now = datetime.datetime.utcnow() amz_date= now.strftime('%Y%m%dT%H%M%SZ')# 例: 20240101T120000Z date_stamp = now.strftime('%Y%m%d')# 例: 20240101 # ------------------------------------------------------- # Step 2: リクエストパラメータ(クエリ文字列)の作成 # ------------------------------------------------------- params = { 'Action' : 'RunInstances', 'Version' : '2016-11-15', 'ImageId' : AMI_ID, 'InstanceType' : 't3.micro', 'MinCount': '1', 'MaxCount': '1', 'Placement.AvailabilityZone': f'{REGION}a', 'NetworkInterface.1.DeviceIndex': '0', 'NetworkInterface.1.AssociatePublicIpAddress': 'false', 'TagSpecification.1.ResourceType' : 'instance', 'TagSpecification.1.Tag.1.Key': 'Name', 'TagSpecification.1.Tag.1.Value' : 'handson-sigv4', } # キーをソートしてクエリ文字列を生成 query_string = urllib.parse.urlencode(sorted(params.items())) # ------------------------------------------------------- # Step 3: 正規リクエスト (Canonical Request) の作成 # ------------------------------------------------------- method = 'GET' canonical_uri= '/' canonical_qs = query_string canonical_headers = f'host:{HOST}\nx-amz-date:{amz_date}\n' if SESSION_TOKEN: canonical_headers += f'x-amz-security-token:{SESSION_TOKEN}\n' signed_headers = 'host;x-amz-date' if SESSION_TOKEN: signed_headers += ';x-amz-security-token' payload_hash = hashlib.sha256(b'').hexdigest() # GET なのでボディは空 canonical_request = '\n'.join([ method, canonical_uri, canonical_qs, canonical_headers, signed_headers, payload_hash, ]) print("\n--- 正規リクエスト ---") print(canonical_request) # ------------------------------------------------------- # Step 4: 署名文字列 (String to Sign) の作成 # ------------------------------------------------------- algorithm= 'AWS4-HMAC-SHA256' credential_scope = f'{date_stamp}/{REGION}/{SERVICE}/aws4_request' string_to_sign = '\n'.join([ algorithm, amz_date, credential_scope, hashlib.sha256(canonical_request.encode('utf-8')).hexdigest(), ]) print("\n--- 署名文字列 ---") print(string_to_sign) # ------------------------------------------------------- # Step 5: 署名の作成 # ------------------------------------------------------- signing_key = get_signature_key(SECRET_KEY, date_stamp, REGION, SERVICE) signature= hmac.new(signing_key, string_to_sign.encode('utf-8'), hashlib.sha256).hexdigest() # ------------------------------------------------------- # Step 6: Authorization ヘッダーの組み立て # ------------------------------------------------------- auth_header = ( f'{algorithm} ' f'Credential={ACCESS_KEY}/{credential_scope}, ' f'SignedHeaders={signed_headers}, ' f'Signature={signature}' ) print("\n--- Authorization ヘッダー ---") print(auth_header) # ------------------------------------------------------- # Step 7: HTTP リクエストを送信 # ------------------------------------------------------- url = f'{ENDPOINT}?{query_string}' headers = { 'x-amz-date': amz_date, 'Authorization': auth_header, } if SESSION_TOKEN: headers['x-amz-security-token'] = SESSION_TOKEN req = urllib.request.Request(url, headers=headers) try: with urllib.request.urlopen(req) as resp: body = resp.read().decode() print("\n--- レスポンス ---") print(body[:500]) # 長いので先頭500文字を表示 except urllib.error.HTTPError as e: print(f"\n--- エラー ---") print(e.read().decode()) EOF |
- スクリプトを実行する:
|
1 2 |
python3 ~/sigv4_ec2_launch.py |
- マネジメントコンソールの EC2 インスタンス一覧で
handson-sigv4が起動していることを確認します。
ポイント
- Authorization ヘッダーには以下の4要素が含まれます:
- AWS4-HMAC-SHA256(アルゴリズム)
- Credential(アクセスキー ID / 日付 / リージョン / サービス)
- SignedHeaders(署名対象ヘッダーの一覧)
- Signature(HMAC-SHA256 で計算された署名)
- CLI や SDK はこの署名処理を自動的に行っています。
- 一時認証情報(CloudShell)の場合は
x-amz-security-tokenヘッダーも必要。
クリーンアップ
ハンズオンで作成したリソースをすべて削除します。
1. EC2 インスタンスの終了
マネジメントコンソールで起動したEC2インスタンスを選択して、[インスタンスの状態]-[インスタンスを終了(削除)]を選択して、確認画面で[終了(削除)]をクリックします。
2. ハンズオンユーザーの削除
ハンズオン用に作成したIAMポリシーやIAMユーザー、IAMロールがあれば必要に応じて削除します。
まとめ
| タスク | 方法 | 認証情報の設定 |
|---|---|---|
| タスク 1〜2 | マネジメントコンソール | コンソールへのサインイン |
| タスク 3 | AWS CLI | CloudShellが自動提供 |
| タスク 4 | Python boto3 | CloudShellが自動提供 |
| タスク 5 | 署名バージョン4(手動) | CloudShell の一時認証情報をboto3経由で取得 |
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
関連記事
-
-
AWS Systems Managerパラメータストアで「Parameter name must be a fully qualified name.」
パラメータストアでパラメータ階層を作成しようとして、パラメータ名に例えば「wor …
-
-
JAWS-UG関西「AI で人を笑わせてみよう!ハンズオン」に参加しました
AI で人を笑わせてみよう!ハンズオン 灼熱の7月最終日にJAWS-UG関西のオ …
-
-
Amazon CloudWatch クロスリージョンクロスアカウントダッシュボードを作成
本ブログのCloudFrontとWAFのアカウントと、EC2、RDS、S3などオ …
-
-
Aurora Serverless Data APIを有効にしてLambdaからクエリを実行
Aurora Serverless作成 MySQLを作成しました。 作成時にDa …
-
-
EC2 Auto Recovery機能を設定しておいた
以前EC2インスタンスのリタイア対象になったこともあり、というより、やっておいて …
-
-
Cloud9初回アクセス時にCodeCommitのリポジトリを自動でクローンする
CloudFormationからCloud9環境を作成する際に、Reposito …
-
-
CloudFormationで起動テンプレートのバージョン更新をした際にAuto ScalingのEC2インスタンスを置き換える
やりたいこと タイトルのとおり、起動テンプレートのバージョン変更(AMIの置換) …
-
-
AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」
AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …
-
-
Amazon SNSサブスクリプションフィルターを設定してPython(boto3)からPublish
上記のような構成でRocketChatを使うとき使わないときがあります。 都度都 …
-
-
「CMC_Central 2024」に参加しました
個人サポーターとしてCMC_Central 2024に参加しました。 オープニン …

