Claude Design は「見た目を作って終わり」ではなく、Claude Code への橋渡しまで考えられています。 デザインができたら、設計情報一式をまとめたパッケージ(handoff bundle)として Claude Code に渡せるという仕組みで、エクスポート先としてローカルのコーディングエージェントや Claude Code Web への引き継ぎが示されています。
今回作成する主なAWSリソースは以下です。 VPC Public Subnet × 2 Internet Gateway Route Table Security Group Application Load Balancer ECS Cluster ECS Service ECS Task Definition IAM Role CloudWatch Logs
Claude Designには使用量の週次リミットがあり、到達してしまいそうだったためスライド作成はここまでとします。 細かい不備は少々あれど、必要最低限の内容は表現できており、資料の叩き台としては十分なレベルです。 構成図については、AWSが公式に提供するアイコンアセットを事前に読み込ませると、より視認性の高い図になるかもしれません。興味のある方は試してみてください。
# aws_iam_role.ecs_task_execution will be created + resource "aws_iam_role" "ecs_task_execution" { + arn = (known after apply) + assume_role_policy = jsonencode( { + Statement = [ + { + Action = "sts:AssumeRole" + Effect = "Allow" + Principal = { + Service = "ecs-tasks.amazonaws.com" } }, ] + Version = "2012-10-17" } ) + create_date = (known after apply) + force_detach_policies = false + id = (known after apply) + managed_policy_arns = (known after apply) + max_session_duration = 3600 + name = "claude-aws-demo-ecs-task-execution-role" + name_prefix = (known after apply) + path = "/" + tags = { + "Name" = "claude-aws-demo-ecs-task-execution-role" } + tags_all = { + "Name" = "claude-aws-demo-ecs-task-execution-role" } + unique_id = (known after apply)
+ inline_policy (known after apply) }
# aws_iam_role_policy_attachment.ecs_task_execution will be created + resource "aws_iam_role_policy_attachment" "ecs_task_execution" { + id = (known after apply) + policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" + role = "claude-aws-demo-ecs-task-execution-role" }
# aws_internet_gateway.main will be created + resource "aws_internet_gateway" "main" { + arn = (known after apply) + id = (known after apply) + owner_id = (known after apply) + tags = { + "Name" = "claude-aws-demo-igw" } + tags_all = { + "Name" = "claude-aws-demo-igw" } + vpc_id = (known after apply) }
# aws_lb.main will be created + resource "aws_lb" "main" { + arn = (known after apply) + arn_suffix = (known after apply) + client_keep_alive = 3600 + desync_mitigation_mode = "defensive" + dns_name = (known after apply) + drop_invalid_header_fields = false + enable_deletion_protection = false + enable_http2 = true + enable_tls_version_and_cipher_suite_headers = false + enable_waf_fail_open = false + enable_xff_client_port = false + enable_zonal_shift = false + enforce_security_group_inbound_rules_on_private_link_traffic = (known after apply) + id = (known after apply) + idle_timeout = 60 + internal = false + ip_address_type = (known after apply) + load_balancer_type = "application" + name = "claude-aws-demo-alb" + name_prefix = (known after apply) + preserve_host_header = false + security_groups = (known after apply) + subnets = (known after apply) + tags = { + "Name" = "claude-aws-demo-alb" } + tags_all = { + "Name" = "claude-aws-demo-alb" } + vpc_id = (known after apply) + xff_header_processing_mode = "append" + zone_id = (known after apply)
+ subnet_mapping (known after apply) }
# aws_lb_listener.http will be created + resource "aws_lb_listener" "http" { + arn = (known after apply) + id = (known after apply) + load_balancer_arn = (known after apply) + port = 80 + protocol = "HTTP" + routing_http_request_x_amzn_mtls_clientcert_header_name = (known after apply) + routing_http_request_x_amzn_mtls_clientcert_issuer_header_name = (known after apply) + routing_http_request_x_amzn_mtls_clientcert_leaf_header_name = (known after apply) + routing_http_request_x_amzn_mtls_clientcert_serial_number_header_name = (known after apply) + routing_http_request_x_amzn_mtls_clientcert_subject_header_name = (known after apply) + routing_http_request_x_amzn_mtls_clientcert_validity_header_name = (known after apply) + routing_http_request_x_amzn_tls_cipher_suite_header_name = (known after apply) + routing_http_request_x_amzn_tls_version_header_name = (known after apply) + routing_http_response_access_control_allow_credentials_header_value = (known after apply) + routing_http_response_access_control_allow_headers_header_value = (known after apply) + routing_http_response_access_control_allow_methods_header_value = (known after apply) + routing_http_response_access_control_allow_origin_header_value = (known after apply) + routing_http_response_access_control_expose_headers_header_value = (known after apply) + routing_http_response_access_control_max_age_header_value = (known after apply) + routing_http_response_content_security_policy_header_value = (known after apply) + routing_http_response_server_enabled = (known after apply) + routing_http_response_strict_transport_security_header_value = (known after apply) + routing_http_response_x_content_type_options_header_value = (known after apply) + routing_http_response_x_frame_options_header_value = (known after apply) + ssl_policy = (known after apply) + tags_all = (known after apply) + tcp_idle_timeout_seconds = (known after apply)
+ default_action { + order = (known after apply) + target_group_arn = (known after apply) + type = "forward" }
+ mutual_authentication (known after apply) }
# aws_lb_target_group.main will be created + resource "aws_lb_target_group" "main" { + arn = (known after apply) + arn_suffix = (known after apply) + connection_termination = (known after apply) + deregistration_delay = "300" + id = (known after apply) + ip_address_type = (known after apply) + lambda_multi_value_headers_enabled = false + load_balancer_arns = (known after apply) + load_balancing_algorithm_type = (known after apply) + load_balancing_anomaly_mitigation = (known after apply) + load_balancing_cross_zone_enabled = (known after apply) + name = "claude-aws-demo-tg" + name_prefix = (known after apply) + port = 80 + preserve_client_ip = (known after apply) + protocol = "HTTP" + protocol_version = (known after apply) + proxy_protocol_v2 = false + slow_start = 0 + tags = { + "Name" = "claude-aws-demo-tg" } + tags_all = { + "Name" = "claude-aws-demo-tg" } + target_type = "ip" + vpc_id = (known after apply)
# aws_route_table.public will be created + resource "aws_route_table" "public" { + arn = (known after apply) + id = (known after apply) + owner_id = (known after apply) + propagating_vgws = (known after apply) + route = [ + { + cidr_block = "0.0.0.0/0" + gateway_id = (known after apply) # (11 unchanged attributes hidden) }, ] + tags = { + "Name" = "claude-aws-demo-public-rt" } + tags_all = { + "Name" = "claude-aws-demo-public-rt" } + vpc_id = (known after apply) }
# aws_route_table_association.public_1 will be created + resource "aws_route_table_association" "public_1" { + id = (known after apply) + route_table_id = (known after apply) + subnet_id = (known after apply) }
# aws_route_table_association.public_2 will be created + resource "aws_route_table_association" "public_2" { + id = (known after apply) + route_table_id = (known after apply) + subnet_id = (known after apply) }