<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serverless Archive | INOTEQ GmbH</title>
	<atom:link href="https://www.inoteq.com/tag/serverless/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.inoteq.com/tag/serverless/</link>
	<description>IT Unternehmensberatung, Software Entwicklung, IT Infrastruktur aus Karlsruhe</description>
	<lastBuildDate>Mon, 22 Jan 2024 10:39:12 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.5</generator>

<image>
	<url>https://www.inoteq.com/wp-content/uploads/2019/12/cropped-Inoteq_Logo_trans_icon-1-32x32.png</url>
	<title>Serverless Archive | INOTEQ GmbH</title>
	<link>https://www.inoteq.com/tag/serverless/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Serverless App mit AWS Services</title>
		<link>https://www.inoteq.com/2021/02/15/integration-von-aws-services-in-einer-todo-list-app/</link>
					<comments>https://www.inoteq.com/2021/02/15/integration-von-aws-services-in-einer-todo-list-app/#respond</comments>
		
		<dc:creator><![CDATA[Aymen Khalki]]></dc:creator>
		<pubDate>Mon, 15 Feb 2021 02:24:10 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://www.inoteq.com/?p=1058</guid>

					<description><![CDATA[<p>In diesem Artikel werden wir das Backend für eine Cloud Anwendung MyProjectManager  entwickeln. Die Anwendung soll u.A. den Benutzern die folgenden Operationen ermöglichen: Anlage, Bearbeitung und Löschen von Aufgaben Erfassung der Arbeitszeit der einzelnen Aufgaben Monitoring des Fortschritts von aktiven Projekten   Der Cloud Anbieter, für den wir uns entschieden haben ist AWS (Amazon Web [&#8230;]</p>
<p>Der Beitrag <a href="https://www.inoteq.com/2021/02/15/integration-von-aws-services-in-einer-todo-list-app/">Serverless App mit AWS Services</a> erschien zuerst auf <a href="https://www.inoteq.com">INOTEQ GmbH</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1058" class="elementor elementor-1058" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-c9b616a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c9b616a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3579fdc" data-id="3579fdc" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-46a4963 elementor-widget elementor-widget-spacer" data-id="46a4963" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-63dfa77 elementor-widget elementor-widget-theme-post-title elementor-page-title elementor-widget-heading" data-id="63dfa77" data-element_type="widget" data-widget_type="theme-post-title.default">
				<div class="elementor-widget-container">
			<h1 class="elementor-heading-title elementor-size-default">Serverless App mit AWS Services</h1>		</div>
				</div>
				<div class="elementor-element elementor-element-814f1f5 elementor-widget elementor-widget-post-info" data-id="814f1f5" data-element_type="widget" data-widget_type="post-info.default">
				<div class="elementor-widget-container">
					<ul class="elementor-inline-items elementor-icon-list-items elementor-post-info">
								<li class="elementor-icon-list-item elementor-repeater-item-c07858a elementor-inline-item" itemprop="datePublished">
						<a href="https://www.inoteq.com/2021/02/15/">
											<span class="elementor-icon-list-icon">
								<i aria-hidden="true" class="fas fa-calendar"></i>							</span>
									<span class="elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-date">
										Februar 15, 2021					</span>
									</a>
				</li>
				<li class="elementor-icon-list-item elementor-repeater-item-1673316 elementor-inline-item" itemprop="author">
						<a href="https://www.inoteq.com/author/akhalki/">
											<span class="elementor-icon-list-icon">
								<i aria-hidden="true" class="far fa-user-circle"></i>							</span>
									<span class="elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-author">
										Aymen Khalki					</span>
									</a>
				</li>
				<li class="elementor-icon-list-item elementor-repeater-item-79c278f elementor-inline-item" itemprop="about">
										<span class="elementor-icon-list-icon">
								<i aria-hidden="true" class="fas fa-tags"></i>							</span>
									<span class="elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-terms">
										<span class="elementor-post-info__terms-list">
				<a href="https://www.inoteq.com/tag/serverless/" class="elementor-post-info__terms-list-item">Serverless</a>				</span>
					</span>
								</li>
				</ul>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-3d339c1 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3d339c1" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-29f61fc" data-id="29f61fc" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0fcf760 elementor-widget elementor-widget-text-editor" data-id="0fcf760" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>In diesem Artikel werden wir das Backend für eine Cloud Anwendung MyProjectManager  entwickeln. Die Anwendung soll u.A. den Benutzern die folgenden Operationen ermöglichen:</p>
<ul>
<li>Anlage, Bearbeitung und Löschen von Aufgaben</li>
<li>Erfassung der Arbeitszeit der einzelnen Aufgaben</li>
<li>Monitoring des Fortschritts von aktiven Projekten</li>
</ul>
<div> </div>
<div>Der Cloud Anbieter, für den wir uns entschieden haben ist AWS (Amazon Web Services). AWS bietet eine Vielfalt von Services (c.a. 175), die ein breites Spektrum an Technologien und Branchenthemen abdecken. Diese Services gewährleisten ein hohes Maß an Sicherheit, Zuverlässigkeit,  Effizienz und Wirtschaftlichkeit. Eine direkte Konsequenz  einer vernünftigen Integration dieser Dienste in einer Anwendung ist die Flexibilität der Architektur, was wiederum die Wartbarkeit und Wiederverwendbarkeit der einzelnen Komponenten erheblich erleichtert.</div>
<div>In den folgenden Abschnitten, werden wir schrittweise die Implementierung unserer Anwendung durchgehen und die relevanten eingesetzten Technologien vorstellen.</div>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-55185a4 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="55185a4" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-88345d8" data-id="88345d8" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-9163029 elementor-toc--minimized-on-tablet elementor-widget elementor-widget-table-of-contents" data-id="9163029" data-element_type="widget" data-settings="{&quot;exclude_headings_by_selector&quot;:[],&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;,&quot;h4&quot;,&quot;h5&quot;,&quot;h6&quot;],&quot;marker_view&quot;:&quot;numbers&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;minimized_on&quot;:&quot;tablet&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}" data-widget_type="table-of-contents.default">
				<div class="elementor-widget-container">
					<div class="elementor-toc__header">
			<h4 class="elementor-toc__header-title">
				Table of Contents			</h4>
							<div class="elementor-toc__toggle-button elementor-toc__toggle-button--expand" role="button" tabindex="0" aria-controls="elementor-toc__9163029" aria-expanded="true" aria-label="Open table of contents"><i aria-hidden="true" class="fas fa-chevron-down"></i></div>
				<div class="elementor-toc__toggle-button elementor-toc__toggle-button--collapse" role="button" tabindex="0" aria-controls="elementor-toc__9163029" aria-expanded="true" aria-label="Close table of contents"><i aria-hidden="true" class="fas fa-chevron-up"></i></div>
					</div>
		<div id="elementor-toc__9163029" class="elementor-toc__body">
			<div class="elementor-toc__spinner-container">
				<i class="elementor-toc__spinner eicon-animation-spin eicon-loading" aria-hidden="true"></i>			</div>
		</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-73746d2 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="73746d2" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1b9b9e9" data-id="1b9b9e9" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-cc18f1e elementor-widget elementor-widget-spacer" data-id="cc18f1e" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-d809dfe elementor-widget elementor-widget-heading" data-id="d809dfe" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Überblick</h2>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-568987a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="568987a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-759d05d" data-id="759d05d" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3c95076 elementor-widget elementor-widget-text-editor" data-id="3c95076" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Das folgende Diagramm stellt die Infrastruktur der Anwendung dar.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a447452 elementor-widget elementor-widget-image" data-id="a447452" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
										<figure class="wp-caption">
										<img fetchpriority="high" decoding="async" width="731" height="517" src="https://www.inoteq.com/wp-content/uploads/2021/02/api.png" class="attachment-large size-large wp-image-1102" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/api.png 731w, https://www.inoteq.com/wp-content/uploads/2021/02/api-300x212.png 300w" sizes="(max-width: 731px) 100vw, 731px" />											<figcaption class="widget-image-caption wp-caption-text">Infrastruktur der MyProjectsManager Anwendung</figcaption>
										</figure>
							</div>
				</div>
				<div class="elementor-element elementor-element-3e8297b elementor-widget elementor-widget-spacer" data-id="3e8297b" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-d55b42c elementor-widget elementor-widget-heading" data-id="d55b42c" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Implementierung und Konzepte</h2>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-3824d85 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3824d85" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6b14ac9" data-id="6b14ac9" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8789588 elementor-widget elementor-widget-heading" data-id="8789588" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">DynamoDb</h4>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5906d47 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5906d47" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3dfc3af" data-id="3dfc3af" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-2423554 elementor-widget elementor-widget-text-editor" data-id="2423554" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Bevor wir in das Technische einsteigen, müssen wir unsere Modelle gemäß der Logik und dem Ziel der Anwendung definieren. Unsere Anwendung dreht sich um drei Hauptentitäten, nämlich das Projekt (Project), die Aufgabe (Task) und der Benutzer (User).<br />Jeder Benutzer hat einen Namen. Das Attribut &#8222;<em>accumulated_workload&#8220; </em>ist die Anzahl der gearbeiteten Minuten. Dieses Feld wird pro erledigte Aufgabe um die entsprechende Arbeitszeit erhöht. Ein Benutzer kann an mehreren Projekten gleichzeitig arbeiten.<br />Jedem Projekt können  mehrere (oder keine) Mitarbeiter zugewiesen werden. Die Projekte bestehen aus Tasks, deren Status den Fortschritt des Projekts bestimmt.<br />Das &#8222;<em>Task&#8220; </em>Objekt beschreibt den Titel, den Status und die gesamte Arbeitszeit einer Aufgabe, sowie der/die Mitarbeiter/in, der daran arbeitet.<br />Das &#8222;<em>id&#8220;</em> Feld ist notwendig, um die einzelnen Objekten, identifizieren zu können.</p>						</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-db7e731 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="db7e731" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-17936a6" data-id="17936a6" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7c61bf9 elementor-widget elementor-widget-text-editor" data-id="7c61bf9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><span style="text-decoration: underline;"><strong>Project</strong></span></p><ul style="font-size: 16px;"><li style="font-size: 16px;">id: <span style="color: #339966;">string</span></li><li style="font-size: 16px;">title: <span style="color: #339966;">string</span></li><li style="font-size: 16px;">tasks: <span style="color: #800080;">Task</span>[]</li><li style="font-size: 16px;">assignees: <span style="color: #339966;">string</span>[]</li><li style="font-size: 16px;">progress: <span style="color: #808000;">float</span></li></ul>						</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-38e4b9a" data-id="38e4b9a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-a106290 elementor-widget elementor-widget-text-editor" data-id="a106290" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><span style="text-decoration: underline;"><strong>Task</strong></span></p><ul><li>id: <span style="color: #008000;">string</span></li><li>title: <span style="color: #008000;">string</span></li><li>assignee: <span style="color: #008000;">string</span></li><li>completed: <span style="color: #0000ff;">boolean</span></li><li>accumulated_workload: <span style="color: #800000;">int</span></li></ul>						</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-7e406db" data-id="7e406db" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-aa604d5 elementor-widget elementor-widget-text-editor" data-id="aa604d5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><span style="text-decoration: underline;"><strong>User</strong></span></p><ul><li>id: <span style="color: #008000;">string</span></li><li>name: <span style="color: #008000;">string</span></li><li>projects: <span style="color: #008000;">string</span>[]</li><li>accumulated_workload: <span style="color: #993300;">int</span></li></ul>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<div class="elementor-element elementor-element-f52e645 elementor-widget elementor-widget-text-editor" data-id="f52e645" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
													</div>
				</div>
				<div class="elementor-element elementor-element-348aa7d elementor-widget elementor-widget-text-editor" data-id="348aa7d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
													</div>
				</div>
				<div class="elementor-element elementor-element-242a25b elementor-widget elementor-widget-text-editor" data-id="242a25b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ein solcher Ansatz für unseren Anwendungsfall lässt sich in einer NoSQL Datenbank sehr einfach realisieren. Im AWS Umfeld redet man dann von der <strong><em>DynamoDb</em></strong>. Einer der größten Vorteile dieses Services ist die schnelle Leistung und nahtloser Skalierbarkeit, die er uns bietet. Darüber hinaus ist der Entwickler vom hohen Aufwand der administrativen Belastungen komplett befreit. Dies bedeutet, dass wir uns um die Hardwarebereitstellung, Einrichtung und Konfiguration nicht mehr kümmern müssen. <span style="font-size: 1rem">Zudem sind ein paar Features vorhanden, die die Funktionalitäten des Services erweitern (z.B. DynamoDb Streams). </span><span style="font-size: 1rem">Tabellen in der DynamoDb können beliebige Datenmengen beinhalten mit einer</span><span style="font-size: 1rem"> Durchsatzkapazität die jederzeit ohne Ausfall oder Leistungseinbuße hoch- oder herunterskaliert werden kann.</span></p><p><span style="font-size: 1rem"><br />Die Anlage von Tabellen in DynamoDb ist in der AWS Console in nur ein paar Klicks erledigt (eine Zeile mit der CLI):</span></p><ul><li>Im DynamoDb Service, links auf &#8222;<em>Tables&#8220; klicken</em></li><li>Auf &#8222;Create Table klicken&#8220;</li><li>Den Namen der Tabelle und des Primärschlüssels angeben</li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-cf47816 elementor-widget__width-inherit elementor-widget elementor-widget-text-editor" data-id="cf47816" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p style="text-align: left">Der Primärschlüssel identifiziert jedes Element in der Tabelle eindeutig. DynamoDB unterstützt zwei verschiedene Arten von Primärschlüsseln :</p><ul><li><strong>Partitionsschlüssel</strong>: DynamoDB verwendet den Wert des Partitionsschlüssels als Eingabe für eine interne Hash-Funktion. Die Ausgabe der Hash-Funktion bestimmt die Partition (physischer interner Speicher von DynamoDB), in der das Element gespeichert wird.</li><li><strong>Partitionsschlüssel und Sortierschlüssel</strong>: In einer Tabelle, die über einen Partitionsschlüssel und einen Sortierschlüssel verfügt, werden alle Elemente mit dem gleichen Partitionsschlüssel in der selben Partition gespeichert, werden aber nach dem Sortierschlüssel (eindeutig) sortiert.</li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-609a0b4 elementor-widget elementor-widget-text-editor" data-id="609a0b4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
													</div>
				</div>
				<div class="elementor-element elementor-element-1d3bd83 elementor-widget elementor-widget-text-editor" data-id="1d3bd83" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wir haben nun die Tabellen für die Projekte und die Benutzer angelegt. Allerdings haben wir bisher weder Projekte noch Benutzer. Wir können die natürlich manuell in der AWS Console anlegen. Das bringt uns aber nicht wirklich voran. Wir brauchen eine Schnittstelle, mit der wir u.a. gegen unsere Datenbank verschiedene CRUD Operationen ausführen können. AWS bietet SDKs für mehrere Programmiersprachen, mit denen wir das tun können. Wir brauchen allerdings eine Schnittstelle, die mehr als nur DynamoDb unterstützt, weil wir bestimmt noch andere Services brauchen werden. Eine solche Lösung heißt <strong><em>&#8222;</em></strong><em><strong>API Gateway&#8220;</strong>. </em></p>						</div>
				</div>
				<div class="elementor-element elementor-element-5179f49 elementor-widget elementor-widget-spacer" data-id="5179f49" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-c3ded8e elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c3ded8e" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1868f30" data-id="1868f30" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-a5c55ca elementor-widget elementor-widget-heading" data-id="a5c55ca" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">API Gateway</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-c401f33 elementor-widget elementor-widget-text-editor" data-id="c401f33" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>API Gateway ist ein AWS Service zum Erstellen, Veröffentlichen, Warten, Überwachen und Sichern von REST-, HTTP-APIs und WebSocket-APIs in jeder Größenordnung. Die API kann auf externe (nicht von AWS) sowie AWS Web Services zugreifen (z.B. Lambda, Step Function, S3, usw&#8230;). Das folgende Diagramm ist ein Beispiel einer Architektur, die API Gateway mit anderen Services einsetzt.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0993158 elementor-widget elementor-widget-spacer" data-id="0993158" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-f6409dd elementor-widget elementor-widget-image" data-id="f6409dd" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
										<figure class="wp-caption">
											<a href="https://www.inoteq.com/wp-content/uploads/2021/02/Product-Page-Diagram_Amazon-API-Gateway-How-Works.png" data-elementor-open-lightbox="yes" data-elementor-lightbox-title="Product-Page-Diagram_Amazon-API-Gateway-How-Works" data-e-action-hash="#elementor-action%3Aaction%3Dlightbox%26settings%3DeyJpZCI6MTA4MiwidXJsIjoiaHR0cHM6XC9cL3d3dy5pbm90ZXEuY29tXC93cC1jb250ZW50XC91cGxvYWRzXC8yMDIxXC8wMlwvUHJvZHVjdC1QYWdlLURpYWdyYW1fQW1hem9uLUFQSS1HYXRld2F5LUhvdy1Xb3Jrcy5wbmcifQ%3D%3D">
							<img decoding="async" width="800" height="352" src="https://www.inoteq.com/wp-content/uploads/2021/02/Product-Page-Diagram_Amazon-API-Gateway-How-Works-1024x451.png" class="attachment-large size-large wp-image-1082" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/Product-Page-Diagram_Amazon-API-Gateway-How-Works-1024x451.png 1024w, https://www.inoteq.com/wp-content/uploads/2021/02/Product-Page-Diagram_Amazon-API-Gateway-How-Works-300x132.png 300w, https://www.inoteq.com/wp-content/uploads/2021/02/Product-Page-Diagram_Amazon-API-Gateway-How-Works-768x338.png 768w, https://www.inoteq.com/wp-content/uploads/2021/02/Product-Page-Diagram_Amazon-API-Gateway-How-Works.png 1180w" sizes="(max-width: 800px) 100vw, 800px" />								</a>
											<figcaption class="widget-image-caption wp-caption-text">Beispiel der Integration von API Gateway und andere AWS Services in einer Anwendung</figcaption>
										</figure>
							</div>
				</div>
				<div class="elementor-element elementor-element-c9bc479 elementor-widget elementor-widget-spacer" data-id="c9bc479" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-c50991b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c50991b" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-476f273" data-id="476f273" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-2323fea elementor-widget elementor-widget-text-editor" data-id="2323fea" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>API Gateway ist die primäre Schnittstelle mit der Clients, Daten vom Backend abrufen und Businesslogik ausführen. Der Service handhabt sämtliche Aufgaben im Zusammenhang mit der Annahme und Verarbeitung extrem vieler gleichzeitigen API-Aufrufe. Zu diesen Aufgaben gehören die Verwaltung des Datenverkehrs, Autorisierung und Zugriffskontrolle auf die entsprechenden Ressourcen. Hier äußern sich die Vorteile der Granularität einer Anwendung, die AWS Services umsetzt; ein Bauteil von mehreren wechselwirkenden Komponenten, dass das ganze System einrichten und steuern kann.</p><p>Für unseren Anwendungsfall brauchen wir eine REST API, die uns ermöglicht:</p><ul><li>Projekte anzulegen, bearbeiten und löschen</li><li>Aufgaben für Projekte anzulegen, bearbeiten und löschen</li><li>Information über die Benutzer zu kriegen (textliche Beschreibung, Avatar, usw&#8230;)</li><li>Arbeitszeit zu erfassen</li></ul><p>Die REST API ist eine Sammlung von Ressourcen und HTTP Methoden, die mit Backend-HTTP-Endpunkten, Lambda-Funktionen oder anderen AWS-Services integriert sind. Ein möglicher Lösungsvorschlag solcher API ist im nächsten Bild veranschaulicht.</p>						</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-e53b0ef elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e53b0ef" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-1e97477" data-id="1e97477" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0e69567 elementor-widget elementor-widget-image" data-id="0e69567" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img decoding="async" width="148" height="300" src="https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.32.20-148x300.png" class="attachment-medium size-medium wp-image-1101" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.32.20-148x300.png 148w, https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.32.20.png 388w" sizes="(max-width: 148px) 100vw, 148px" />													</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-c611e83" data-id="c611e83" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-3ad16a8 elementor-widget elementor-widget-text-editor" data-id="3ad16a8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Das Erstellen einer API Gateway ist auch recht unkompliziert.</p><ol><li>Im API Gateway Service oben links auf &#8222;APIs&#8220; und dann auch &#8222;Create API&#8220; klicken.</li><li>REST-API wählen mit einem Klick auf &#8222;Build&#8220;.</li><li>Einen Namen und eine Beschreibung der API eingeben.</li><li>Regional als Typ des Endpunktes setzen</li></ol>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-b2b7ceb elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="b2b7ceb" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-974d700" data-id="974d700" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-421ec92 elementor-widget elementor-widget-text-editor" data-id="421ec92" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
													</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-591bfb7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="591bfb7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a0cf459" data-id="a0cf459" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0222a87 elementor-widget elementor-widget-heading" data-id="0222a87" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Lambda Funktionen</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-2ec6608 elementor-widget elementor-widget-text-editor" data-id="2ec6608" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>AWS Lambda ist ein Datenverarbeitungsservice, mit dem wir Code ausführen können, ohne Server bereitstellen oder verwalten zu müssen. Die gesamte Administration der Datenverarbeitungsressourcen, einschließlich der Server- und Betriebssystemwartung, Kapazitätsbereitstellung, automatische Skalierung sowie der Code-Überwachung und -Protokollierung ist dem Dienst überlassen. Amazon Lambda unterstützt mehrere Programmiersprachen, z.B. Python, Java, Node.js, usw&#8230;</p>
<p>Code in Lambda wird ausgeführt als Reaktion auf ein Ereignis. Die Ursprung des Ereignisses nennt man <em>Auslöser</em>. Dies kann z.B.. ein HTTP Aufruf eines Endpunktes der API Gateway sein, eine Änderung von Daten in einer S3 Bucket oder DynamoDb Tabelle sowie periodische Ereignisse (scheduled events). Das Objekt, das das Ereignis repräsentiert wird an die Funktion übermittelt, die ein Ergebnis zurückgibt oder Side-effects verursacht (oder beides). In diesem Kontext handelt es um eine &#8222;serverlosen&#8220; Anwendung, in der kein Code läuft, wenn keine Anfrage verarbeitet werden muss.</p>
<p>Wir schauen nun wie wir diesen Dienst in unserer Anwendung verwenden können. In unserer API haben wir einen Endpunkt definiert, den wir aufrufen, um Projekte in der Datenbank anzulegen. Dafür verwenden wir die HTTP POST Methode. Der Payload soll mit dem von uns definierten Modell des Projekts übereinstimmen. Die HTTP Antwort soll das in der Projekttabelle angelegte Objekt zurückgeben. Hierfür werden wir den Code in Python schreiben.</p>
<p> </p>						</div>
				</div>
				<div class="elementor-element elementor-element-4063cc9 elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="4063cc9" data-element_type="widget" data-settings="{&quot;slides_to_show&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
					<div class="elementor-image-carousel-wrapper swiper-container" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/elementor/thumbs/Screenshot-2021-02-15-at-10.33.32-1-p38dblyhyjhpztiwfvi9an0i3rv03k003vuwxp9g9s.png" alt="Screenshot 2021-02-15 at 10.33.32" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/elementor/thumbs/Screenshot-2021-02-15-at-10.53.11-p38dblyhyjhpztiwfvi9an0i3rv03k003vuwxp9g9s.png" alt="Screenshot 2021-02-15 at 10.53.11" /></figure></div>			</div>
												<div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-left"></i>					</div>
					<div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-right"></i>					</div>
				
									<div class="swiper-pagination"></div>
									</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-79f38ea elementor-widget elementor-widget-html" data-id="79f38ea" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #008800; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">json</span>
<span style="color: #008800; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">boto3</span>
<span style="color: #008800; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">os</span>
<span style="color: #008800; font-weight: bold">import</span> <span style="color: #0e84b5; font-weight: bold">uuid</span>

<span style="color: #008800; font-weight: bold">def</span> <span style="color: #0066BB; font-weight: bold">lambda_handler</span>(event, context):
    
    project <span style="color: #333333">=</span> event[<span style="background-color: #fff0f0">&#39;project&#39;</span>]
    projects_table_name <span style="color: #333333">=</span> os<span style="color: #333333">.</span>environ<span style="color: #333333">.</span>get(<span style="background-color: #fff0f0">&#39;PROJECTS_TABLE_NAME&#39;</span>)
    
    <span style="color: #008800; font-weight: bold">if</span> <span style="color: #000000; font-weight: bold">not</span> dynamodb:
        dynamodb <span style="color: #333333">=</span> boto3<span style="color: #333333">.</span>resource(<span style="background-color: #fff0f0">&#39;dynamodb&#39;</span>)

    table <span style="color: #333333">=</span> dynamodb<span style="color: #333333">.</span>Table(projects_table_name)
    
    project[<span style="background-color: #fff0f0">&#39;id&#39;</span>] <span style="color: #333333">=</span> <span style="color: #007020">str</span>(uuid<span style="color: #333333">.</span>uuid4())
    response <span style="color: #333333">=</span> table<span style="color: #333333">.</span>put_item(
        Item<span style="color: #333333">=</span>project,
        ReturnValues<span style="color: #333333">=</span>ALL_NEW
        )
    
    newProject <span style="color: #333333">=</span> response<span style="color: #333333">.</span>get(<span style="background-color: #fff0f0">&#39;Attributes&#39;</span>)
    <span style="color: #008800; font-weight: bold">return</span> {
        <span style="background-color: #fff0f0">&#39;statusCode&#39;</span>: <span style="color: #0000DD; font-weight: bold">200</span>,
        <span style="background-color: #fff0f0">&#39;headers&#39;</span>: {
            <span style="background-color: #fff0f0">&quot;Access-Control-Allow-Headers&quot;</span> : <span style="background-color: #fff0f0">&quot;*&quot;</span>,
            <span style="background-color: #fff0f0">&quot;Access-Control-Allow-Origin&quot;</span>: <span style="background-color: #fff0f0">&quot;*&quot;</span>,
            <span style="background-color: #fff0f0">&quot;Access-Control-Allow-Methods&quot;</span>: <span style="background-color: #fff0f0">&quot;OPTIONS,POST,GET&quot;</span>
        }
        <span style="background-color: #fff0f0">&#39;body&#39;</span>: json<span style="color: #333333">.</span>dumps(newProject)
    }
</pre></div>
		</div>
				</div>
				<div class="elementor-element elementor-element-952043d elementor-widget elementor-widget-text-editor" data-id="952043d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wir können unsere implementierte Lambda Funktion sogar in der AWS Console testen. Wir stellen einen Payload bereit, führen die Funktion aus und schauen, ob in der Projekttabelle ein neues Projekt erscheint.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-56b6065 elementor-widget elementor-widget-text-editor" data-id="56b6065" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Der Rückgabewert von Lambda Funktionen ist meistens ein JSON Objekt, Text (z.B. base64, plain). Es ist natürlich auch möglich binäre Dateien zurückzugeben. Diese Dateien werden allerdings von einem Speicherdienst (s3) mittels einer SDK geholt und dann weitergeleitet (oder andersrum). Dies ist unvermeidlich, wenn eine spezifische Analyse oder Verarbeitung der Datei notwendig ist. In diesem Fall muss darauf geachtet werden, dass die Daten nicht verloren gehen, die richtigen HTTP Headers an den Clients gesendet werden und dass die Lambda Funktion über die richtigen Berechtigungen verfügt. Dahingegen würde der Aufwand für ein normales Down- oder Upload zu viel sein.</p>
<p>Dies betrifft unsere Anwendung, wenn wir z.B. die Avatars der Benutzer in einer S3 Bucket speichern wollen. Hier wäre es viel vernünftiger, die Lösung die uns AWS bietet einzusetzen &#8211; die direkte Integration von S3 in API Gateway.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-e17b417 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e17b417" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-abe1cd4" data-id="abe1cd4" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8ce89b5 elementor-widget elementor-widget-heading" data-id="8ce89b5" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">S3 (Simple Storage Service)</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-7e01540 elementor-widget elementor-widget-text-editor" data-id="7e01540" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Amazon S3 besitzt eine einfache Web-Service-Schnittstelle zum Speichern und Abrufen einer beliebigen Datenmenge zu jeder Zeit und von jedem Ort im Internet aus. S3 definiert hauptsächlich drei Schlüsselwörter:</p>						</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-82f3fd3 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="82f3fd3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-a5e609f" data-id="a5e609f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5e478dc elementor-widget elementor-widget-image" data-id="5e478dc" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="150" height="150" src="https://www.inoteq.com/wp-content/uploads/2021/02/aws-s3-bucket-150x150.png" class="attachment-thumbnail size-thumbnail wp-image-1088" alt="" />													</div>
				</div>
				<div class="elementor-element elementor-element-a377a78 elementor-widget elementor-widget-text-editor" data-id="a377a78" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Bucket: Ein Behälter für Objekte, die in Amazon S3 gespeichert werden. Buckets strukturieren den Amazon S3-Namespace auf der höchsten Ebene und werden auch für die Zugriffskontrolle eingesetzt. Überdies dienen sie im Rahmen der Erstellung von Nutzungsberichten als Auswertungseinheit.</p>						</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-65b18f8" data-id="65b18f8" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-5549084 elementor-widget elementor-widget-image" data-id="5549084" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="150" height="150" src="https://www.inoteq.com/wp-content/uploads/2021/02/file-150x150.png" class="attachment-thumbnail size-thumbnail wp-image-1089" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/file-150x150.png 150w, https://www.inoteq.com/wp-content/uploads/2021/02/file.png 225w" sizes="(max-width: 150px) 100vw, 150px" />													</div>
				</div>
				<div class="elementor-element elementor-element-4c56aa6 elementor-widget elementor-widget-text-editor" data-id="4c56aa6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Objekt: Objekte sind die Grundeinheiten, die in Amazon S3 gespeichert werden. Objekte bestehen aus Objekt- und Metadaten. Die Datenteile sind für Amazon S3 unverständlich. Metadaten bestehen aus mehreren Name/Wert-Paaren, die das Objekt beschreiben. Ein Objekt wird innerhalb eines Buckets eindeutig durch einen Schlüssel (Name) und eine Versions-ID identifiziert.</p>						</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-07d4b2f" data-id="07d4b2f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-13b3ba7 elementor-widget elementor-widget-image" data-id="13b3ba7" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="512" height="221" src="https://www.inoteq.com/wp-content/uploads/2021/02/key_blue_cropped.png" class="attachment-full size-full wp-image-1090" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/key_blue_cropped.png 512w, https://www.inoteq.com/wp-content/uploads/2021/02/key_blue_cropped-300x129.png 300w" sizes="(max-width: 512px) 100vw, 512px" />													</div>
				</div>
				<div class="elementor-element elementor-element-e5c1f7d elementor-widget elementor-widget-text-editor" data-id="e5c1f7d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Schlüssel: Ein Schlüssel ist der eindeutige Bezeichner für ein Objekt in einem Bucket. Jedes Objekt in einem Bucket besitzt genau einen Schlüssel. Jedes Objekt wird durch die Kombination aus Bucket, Schlüssel und Versions-ID eindeutig identifiziert. Amazon S3 fungiert also als grundlegende Datenzuordnung zwischen „Bucket + Schlüssel + Version“ und dem Objekt selbst.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-810eb10 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="810eb10" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a8421e2" data-id="a8421e2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-1cd4027 elementor-widget elementor-widget-text-editor" data-id="1cd4027" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zunächst legen wir einen neuen Bucket &#8222;my-project-manager-bucket&#8220; an. In dem Bucket ein neues Objekt kreiert werden mit dem Schlüssel &#8222;userId&#8220;, was die ID des Benutzers entspricht, zudem alle Objekte unter diesem Verzeichnis gehören. Obwohl dieses Objekt an sich keine binäre Datei ist, bildet es eine logische Hierarchie und wird dann wie ein Ordner zu betrachten. Wenn der Benutzer einen Avatar hochlädt, wird das Bild mit dem Schlüssel &#8222;my-project-manager-bucket/{userId}/avatar&#8220; angelegt, was bei jeder Abfrage des API Gateway Endpunktes heruntergeladen wird.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e7c36b9 elementor-widget elementor-widget-text-editor" data-id="e7c36b9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Die folgende Blöcke stellen die notwendigen Schritte der Integration von S3 in der API Gateway dar. Zuerst definieren wir einer &#8222;<em>Ausführungsrolle</em>&#8222;, die API Gateway im Runtime übernimmt, um auf unser Bucket zugreifen zu können. Zudem muss für die Rolle die Vertrauensstellung für API Gateway eingerichtet werden, damit API Gateway die Rolle übernehmen kann.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a8922d1 elementor-widget elementor-widget-heading" data-id="a8922d1" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<div class="elementor-heading-title elementor-size-default">Definition der Ausführungsrolle</div>		</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-3318765 elementor-section-full_width elementor-section-content-space-around elementor-section-height-default elementor-section-height-default" data-id="3318765" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-a565de3" data-id="a565de3" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-061f55d elementor-widget__width-inherit elementor-widget elementor-widget-html" data-id="061f55d" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">{
    <span style="color: #007700">&quot;Version&quot;</span>: <span style="background-color: #fff0f0">&quot;2012-10-17&quot;</span>,
    <span style="color: #007700">&quot;Statement&quot;</span>: [
        {
            <span style="color: #007700">&quot;Effect&quot;</span>: <span style="background-color: #fff0f0">&quot;Allow&quot;</span>,
            <span style="color: #007700">&quot;Action&quot;</span>: [
                <span style="background-color: #fff0f0">&quot;s3:GetObject&quot;</span>,
                <span style="background-color: #fff0f0">&quot;s3:PutObject&quot;</span>,
                <span style="background-color: #fff0f0">&quot;s3:DeleteObject&quot;</span>
            ],
            <span style="color: #007700">&quot;Resource&quot;</span>: <span style="background-color: #fff0f0">&quot;arn:aws:s3:::my-project-manager-bucket&quot;</span>
        }
    ]
}
</pre></div>

		</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-40ad82b" data-id="40ad82b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-11f7f1f elementor-widget__width-inherit elementor-widget elementor-widget-html" data-id="11f7f1f" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">{
  <span style="color: #007700">&quot;Version&quot;</span>: <span style="background-color: #fff0f0">&quot;2012-10-17&quot;</span>,
  <span style="color: #007700">&quot;Statement&quot;</span>: [
    {
      <span style="color: #007700">&quot;Sid&quot;</span>: <span style="background-color: #fff0f0">&quot;&quot;</span>,
      <span style="color: #007700">&quot;Effect&quot;</span>: <span style="background-color: #fff0f0">&quot;Allow&quot;</span>,
      <span style="color: #007700">&quot;Principal&quot;</span>: {
        <span style="color: #007700">&quot;Service&quot;</span>: <span style="background-color: #fff0f0">&quot;apigateway.amazonaws.com&quot;</span>
      },
      <span style="color: #007700">&quot;Action&quot;</span>: <span style="background-color: #fff0f0">&quot;sts:AssumeRole&quot;</span>
    }
  ]
}
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<div class="elementor-element elementor-element-81e1a2a elementor-widget elementor-widget-spacer" data-id="81e1a2a" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-89ebf5b elementor-widget elementor-widget-heading" data-id="89ebf5b" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<div class="elementor-heading-title elementor-size-default">Definition der Methode die S3 integriert</div>		</div>
				</div>
				<div class="elementor-element elementor-element-b04680a elementor-widget elementor-widget-image" data-id="b04680a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="800" height="650" src="https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.30.29-1024x832.jpeg" class="attachment-large size-large wp-image-1123" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.30.29-1024x832.jpeg 1024w, https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.30.29-300x244.jpeg 300w, https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.30.29-768x624.jpeg 768w, https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.30.29-1536x1249.jpeg 1536w, https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-10.30.29.jpeg 1700w" sizes="(max-width: 800px) 100vw, 800px" />													</div>
				</div>
				<div class="elementor-element elementor-element-fef7e60 elementor-widget elementor-widget-spacer" data-id="fef7e60" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-b5890f1 elementor-widget elementor-widget-heading" data-id="b5890f1" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">IAM Policies</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-d4795d4 elementor-widget elementor-widget-text-editor" data-id="d4795d4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wir haben für alle bisher verwendeten Services bestimmte Policies und Rollen definieren müssen. Wir haben dennoch noch nicht gesehen, was diese Policies sind, wozu wir sie brauchen und wie die überhaupt funktionieren.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-51aaa7b elementor-widget elementor-widget-text-editor" data-id="51aaa7b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>AWS Identity and Access Management (IAM) ist ein Webservice, mit dem wir den Zugriff auf AWS Ressourcen steuern.</p><p>Wir können mit IAM verschiedenen Benutzern verschiedene Berechtigungen für verschiedene Ressourcen erteilen. Das Beispiel haben wir bei der Implementierung von der Lambda Funktion &#8222;MyProjectManager-AddProject&#8220; gesehen, in dem wir dieser Identität eine Rolle zugewiesen haben, die sie erlaubt, ausschließlich auf der &#8222;ProjectsTable&#8220; Projekte anzulegen, zu listen, zu löschen und zu lesen. Das gleiche Prinzip gilt für andere AWS Ressourcen. Man unterscheidet hauptsächlich zwischen Typen von Berechtigungen und Richtlinien in AWS</p>						</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-6b91bd7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6b91bd7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-8f51dfd" data-id="8f51dfd" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8fb6e98 elementor-widget elementor-widget-text-editor" data-id="8fb6e98" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><b><em>Identitätsbasierte Richtlinien<br /></em></b>steuern, welche Aktionen die Identität für welche Ressourcen und unter welchen Bedingungen ausführen kann</p>						</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-02c2f00" data-id="02c2f00" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-7201591 elementor-widget elementor-widget-text-editor" data-id="7201591" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><b><em>Ressourcenbasierte Richtlinien<br /></em></b>steuern, welche Aktionen ein bestimmter Prinzipal mit dieser Ressource durchführen kann und unter welchen Bedingungen dies möglich ist.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<div class="elementor-element elementor-element-395b787 elementor-widget elementor-widget-text-editor" data-id="395b787" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ein <em>Prinzipal</em> ist eine Person oder Anwendung, die eine Anforderung für eine Aktion oder Operation für eine AWS-Ressource stellen kann.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1205fe1 elementor-widget elementor-widget-spacer" data-id="1205fe1" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-ecff7f3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="ecff7f3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bef0cd2" data-id="bef0cd2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-d345d86 elementor-widget elementor-widget-heading" data-id="d345d86" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Step Functions</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-1580535 elementor-widget elementor-widget-text-editor" data-id="1580535" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Häufig kommt es vor, dass in einer Anwendung als Reaktion auf ein Ereignis, ein bestimmter Prozess ausgeführt werden muss. Zum Beispiel eine Bestellung eines Produktes an der mehrere Parteien beteiligt sind. Um das Beispiel zu konkretisieren, nehmen wir an, dass die Reihenfolge wichtig ist. Falls eine Partei in der Mitte der Kette nicht benachrichtigt werden kann, muss ein Fallback Szenario stattfinden&#8230; (das kann natürlich noch komplizierter sein) Für einen solchen Fall muss eine saubere, wartbare und relativ unkompliezierte Lösung erdacht werden. </p><p>Amazon Step Functions bietet ein Framework, das die Komplexität solcher Prozesse erheblich reduziert, in dem wir den Fokus auf dessen einzelnen Elementen setzen können und damit solche Szenarien überwinden können. Es ist ein serverloser Funktionsorchestrator, der die Sequenzierung von AWS Lambda-Funktionen und mehreren AWS-Services zu geschäftskritischen Anwendungen vereinfacht. Mit seinen integrierten Bedienelementen verwaltet Step Functions die Reihenfolge, die Fehlerbehandlung, die Wiederholungslogik und den Status und nimmt dem Team eine erhebliche operative Belastung ab.</p><p>Der Dienst kann für unsere Anwendung trotz Mangel an Komplexität eine wichtige Aufgabe erledigen- die Zeiterfassung. <br />Den Prozess können wir wie folgend beschreiben.</p><p> </p>						</div>
				</div>
				<div class="elementor-element elementor-element-9f6023d elementor-widget elementor-widget-text-editor" data-id="9f6023d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ol start="0"><li>Die &#8222;State Machine&#8220; wird von einem   regulären Ereignis getriggert (am ersten Tag jedes Monats)</li><li>Die erste Lambda Funktion holt alle aktive Projekte von der &#8222;ProjectsTable&#8220;. Hier können wir den dynamischen Parallelismus, den die Step Functions unterstützen verwenden, um den Prozess zu beschleunigen, in dem für jedes Projekt ein neuer Knoten instantieert wird.</li><li>Die zweite Lambda Funktion, die von jedem dieser Knoten ausgeführt wird, wird in der &#8222;UsersTable&#8220; für jeden validen Benutzer das Attribut &#8222;accumulated_workload&#8220; aktualisieren&#8220;. </li><li>Eine dritte Lambda Funktion erstellt ein Bericht (Abrechnung) der neuen Änderungen und leitet den an einen anderen Service weiter (SNS, SES, usw..) oder speichern den in S3.</li><li>Die Aufgabe der vierten Lambda Funktion ist Clean-up.</li></ol>						</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-5d788c6 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5d788c6" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-176994e" data-id="176994e" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-eddc890 elementor-widget elementor-widget-html" data-id="eddc890" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">{
  <span style="color: #007700">&quot;Comment&quot;</span>: <span style="background-color: #fff0f0">&quot;Billing&quot;</span>,
  <span style="color: #007700">&quot;StartAt&quot;</span>: <span style="background-color: #fff0f0">&quot;GetProjects&quot;</span>,
  <span style="color: #007700">&quot;States&quot;</span>: {
    <span style="color: #007700">&quot;GetProjects&quot;</span>: {
      <span style="color: #007700">&quot;Type&quot;</span>: <span style="background-color: #fff0f0">&quot;Task&quot;</span>,
      <span style="color: #007700">&quot;Resource&quot;</span>: <span style="background-color: #fff0f0">&quot;arn:aws:lambda:eu-central-1:&lt;account_id&gt;:function:MyProjectsManager-GetProjects&quot;</span>,
      <span style="color: #007700">&quot;Next&quot;</span>: <span style="background-color: #fff0f0">&quot;ProcessProjects&quot;</span>
    },
    <span style="color: #007700">&quot;ProcessProjects&quot;</span>: {
      <span style="color: #007700">&quot;Type&quot;</span>: <span style="background-color: #fff0f0">&quot;Map&quot;</span>,
      <span style="color: #007700">&quot;MaxConcurrency&quot;</span>: <span style="color: #0000DD; font-weight: bold">5</span>,
      <span style="color: #007700">&quot;Iterator&quot;</span>: {
        <span style="color: #007700">&quot;StartAt&quot;</span>: <span style="background-color: #fff0f0">&quot;UpdateWorkload&quot;</span>,
        <span style="color: #007700">&quot;States&quot;</span>: {
          <span style="color: #007700">&quot;UpdateWorkload&quot;</span>: {
          <span style="color: #007700">&quot;Type&quot;</span>: <span style="background-color: #fff0f0">&quot;Task&quot;</span>,
          <span style="color: #007700">&quot;Resource&quot;</span>: <span style="background-color: #fff0f0">&quot;arn:aws:lambda:eu-central-1:&lt;account_id&gt;:function:MyProjectsManager-UpdateWorkload&quot;</span>,
          <span style="color: #007700">&quot;End&quot;</span>: <span style="color: #008800; font-weight: bold">true</span>
          }
        }
      },
      <span style="color: #007700">&quot;Next&quot;</span>: <span style="background-color: #fff0f0">&quot;EmailBills&quot;</span>
    },
    <span style="color: #007700">&quot;EmailBills&quot;</span>: {
      <span style="color: #007700">&quot;Type&quot;</span>: <span style="background-color: #fff0f0">&quot;Pass&quot;</span>,
      <span style="color: #007700">&quot;Result&quot;</span>: <span style="background-color: #fff0f0">&quot;Bills have been generated and emailed to the employees&quot;</span>,
      <span style="color: #007700">&quot;Next&quot;</span>: <span style="background-color: #fff0f0">&quot;CleanUp&quot;</span>
    },
    <span style="color: #007700">&quot;CleanUp&quot;</span>: {
      <span style="color: #007700">&quot;Type&quot;</span>: <span style="background-color: #fff0f0">&quot;Pass&quot;</span>,
      <span style="color: #007700">&quot;Result&quot;</span>: <span style="background-color: #fff0f0">&quot;Clean up complete&quot;</span>,
      <span style="color: #007700">&quot;End&quot;</span>: <span style="color: #008800; font-weight: bold">true</span>
    }
  }
}
</pre></div>

		</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-e3140a6" data-id="e3140a6" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-e5ad2b4 elementor-widget elementor-widget-image" data-id="e5ad2b4" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="203" height="421" src="https://www.inoteq.com/wp-content/uploads/2021/02/stepfunctions_graph.png" class="attachment-large size-large wp-image-1112" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/stepfunctions_graph.png 203w, https://www.inoteq.com/wp-content/uploads/2021/02/stepfunctions_graph-145x300.png 145w" sizes="(max-width: 203px) 100vw, 203px" />													</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<div class="elementor-element elementor-element-4078892 elementor-widget elementor-widget-spacer" data-id="4078892" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-5010c03 elementor-widget elementor-widget-text-editor" data-id="5010c03" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Das Triggern der regulären Ereignissen kann u.a. durch die Definition einer Regel im Cron Syntax ( 0 0 1 * * ) erreicht werden. Regeln werden in EventBusse definiert (CloudWatch, EventBridge, usw&#8230;)</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-0846873 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="0846873" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-86b43cc" data-id="86b43cc" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0b1975e elementor-widget elementor-widget-spacer" data-id="0b1975e" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-2a35cf7 elementor-widget elementor-widget-heading" data-id="2a35cf7" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Cognito</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-4e30bdc elementor-widget elementor-widget-text-editor" data-id="4e30bdc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ein kritischer Punkt bei der Entwicklung von Web Anwendungen ist die Authentifizierung der ankommenden Anfragen, da wir meistens Zugriff auf sensiblen Daten auf eine bestimmte Gruppe beschränken wollen. Amazon Cognito nimmt uns dabei viel Aufwand ab mit seinen Authentifizierungs- und Autorisierungsmechanismen und seiner Benutzerverwaltung. Die Benutzer können sich direkt mit einem Benutzernamen und einem Passwort oder über einen Drittanbieter wie beispielsweise Facebook, Amazon, Google oder Apple anmelden.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9283e5d elementor-widget elementor-widget-text-editor" data-id="9283e5d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Die zwei Hauptkomponenten von Amazon Cognito sind Benutzerpools und Identitäten-Pools. Benutzerpools sind Benutzerverzeichnisse, die Registrierungs- und Anmeldungsoptionen für die App-Nutzer bereitstellen. Identitäten-Pools ermöglichen es, den Benutzern Zugriff auf andere AWS-Services zu gewähren. Das folgende Bild dient der Veranschaulichung des Authentifizierungsprozesses.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-676614a elementor-widget elementor-widget-image" data-id="676614a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="368" height="411" src="https://www.inoteq.com/wp-content/uploads/2021/02/cognito.png" class="attachment-large size-large wp-image-1080" alt="" srcset="https://www.inoteq.com/wp-content/uploads/2021/02/cognito.png 368w, https://www.inoteq.com/wp-content/uploads/2021/02/cognito-269x300.png 269w" sizes="(max-width: 368px) 100vw, 368px" />													</div>
				</div>
				<div class="elementor-element elementor-element-24c3b2e elementor-widget elementor-widget-text-editor" data-id="24c3b2e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ol><li><p>Der Benutzer meldet sich über einen Benutzerpool an und erhält nach erfolgreicher Authentifizierung Benutzerpool-Token.</p></li><li><p>Die  Anwendung tausch die Benutzerpool-Tokens über einen Identitäten-Pool gegen AWS-Anmeldeinformationen aus.</p></li><li><p>Nun kann der Benutzer diese AWS-Anmeldeinformationen nutzen, um auf andere AWS-Services wie Amazon S3 oder DynamoDB zuzugreifen.</p></li></ol>						</div>
				</div>
				<div class="elementor-element elementor-element-eeb34a1 elementor-widget elementor-widget-text-editor" data-id="eeb34a1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Cognito bietet auch die Möglichkeit die Sign-up und Sign-in Prozesse durch Events (Post-Signup-Confirmation, Pre-Sign-In, etc&#8230;) zu verfeinern und darauf zu reagieren (Integration von AWS Services in diesen Prozessen, wie S3, Lambda oder DynamoDb, usw&#8230;). </p>						</div>
				</div>
				<div class="elementor-element elementor-element-f2001f6 elementor-widget elementor-widget-text-editor" data-id="f2001f6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Nachdem der Userpool angelegt und eingerichtet ist, reicht es in der API Gateway einen neuen Authorizer anzulegen. Für jeden Endpunkt, den wir absichern möchten müssen wir in der Method Request den neu angelegten Authorizer setzen.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-dae756a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="dae756a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5c46461" data-id="5c46461" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-d54c500 elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="d54c500" data-element_type="widget" data-settings="{&quot;slides_to_show&quot;:&quot;1&quot;,&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
					<div class="elementor-image-carousel-wrapper swiper-container" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-15.38.51-768x422.png" alt="Screenshot 2021-02-15 at 15.38.51" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 von 2"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://www.inoteq.com/wp-content/uploads/2021/02/Screenshot-2021-02-15-at-15.40.53-768x357.png" alt="Screenshot 2021-02-15 at 15.40.53" /></figure></div>			</div>
												<div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-left"></i>					</div>
					<div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-right"></i>					</div>
				
									<div class="swiper-pagination"></div>
									</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-c9f5bef elementor-widget elementor-widget-text-editor" data-id="c9f5bef" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Sie finden <a href="https://www.inoteq.com/wp-content/uploads/2021/02/IntegrationAWSServices_ServerlessApp_compressed-1.pdf" target="_blank" rel="noopener">hier</a> eine Präsentation, die die oben vorgestellten Services von AWS und deren Eigenschaften zusammenfasst. </p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-75950f7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="75950f7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f89fae2" data-id="f89fae2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4abfe18 elementor-widget elementor-widget-heading" data-id="4abfe18" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">AWS CloudFormation</h2>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-7081cc8 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7081cc8" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce4c307" data-id="ce4c307" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-53a2bac elementor-widget elementor-widget-text-editor" data-id="53a2bac" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>AWS bietet uns eine alternative Vorgehensweise, die die Entwicklung und Einrichtung der AWS Services, die wir brauchen erleichtert. In einer YAML Datei, können wir unseren ganzen Stack beschreiben. Sobald die Vorlage validiert und deployed ist, kümmert sich CloudFormation um die Bereitstellung und Konfiguration der beschriebenen Ressourcen und deren Abhängigkeiten. Die Dokumentation beschreibt <a href="https://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/Welcome.html">hier</a> mehrere Szenarien, wo CloudFormation hilfreich sein kann. </p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-024e416 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="024e416" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-885a14f" data-id="885a14f" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-b434c38 elementor-widget elementor-widget-text-editor" data-id="b434c38" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Folgend zeigen wir eine vereinfachte Version unserer oben beschriebenen API in der Form einer CloudFormation Vorlage.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-a96c289 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="a96c289" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b527b45" data-id="b527b45" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-616a503 elementor-widget elementor-widget-heading" data-id="616a503" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h5 class="elementor-heading-title elementor-size-default">API Gateway</h5>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-8c549b7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8c549b7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d075812" data-id="d075812" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-819d5f4 elementor-widget elementor-widget-text-editor" data-id="819d5f4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zunächst definieren wir eine REST API</p>						</div>
				</div>
				<div class="elementor-element elementor-element-8244fa7 elementor-widget elementor-widget-html" data-id="8244fa7" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"> ApiGatewayRestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Description: API Gateway for the ProjectsManager Application
      EndpointConfiguration:
        Types:
          - REGIONAL
      Name: my-projects-manager-api-2
</pre></div>

		</div>
				</div>
				<div class="elementor-element elementor-element-8158f49 elementor-widget elementor-widget-text-editor" data-id="8158f49" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Die API Gateway braucht noch eine Stage und eine Deployment Ressource. Die definieren wir wie folgend</p>						</div>
				</div>
				<section class="elementor-section elementor-inner-section elementor-element elementor-element-f9c2e1d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f9c2e1d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2813e04" data-id="2813e04" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-76f999b elementor-widget elementor-widget-html" data-id="76f999b" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  ApiGatewayStage:
    Type: AWS::ApiGateway::Stage
    Properties:
      DeploymentId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayDeployment
      Description: Lambda API Stage dev
      RestApiId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayRestApi
      StageName: <span style="background-color: #fff0f0">&#39;dev&#39;</span>
</pre></div>

		</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-30c5877" data-id="30c5877" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-48ab0e4 elementor-widget elementor-widget-html" data-id="48ab0e4" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  ApiGatewayDeployment:
    Type: AWS::ApiGateway::Deployment
    DependsOn: ApiGatewayMethod
    Properties:
      Description: Lambda API Deployment
      RestApiId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayRestApi
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<div class="elementor-element elementor-element-e7d6f28 elementor-widget elementor-widget-text-editor" data-id="e7d6f28" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wir legen nun zwei Ressourcen an und die entsprechenden Methoden. Wir möchten das Beispiel einer Lambda Integration (links) und einer S3 Integration (rechts) zeigen.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-069877c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="069877c" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-57bbb1c" data-id="57bbb1c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<section class="elementor-section elementor-inner-section elementor-element elementor-element-67bd197 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="67bd197" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2639823" data-id="2639823" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8e9cad0 elementor-widget elementor-widget-html" data-id="8e9cad0" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  
  ApiGatewayResourceProjects:
    Type: AWS::ApiGateway::Resource
    Properties:
      ParentId: <span style="color: #333399; font-weight: bold">!GetAtt</span> ApiGatewayRestApi.RootResourceId
      PathPart: <span style="background-color: #fff0f0">&#39;projects&#39;</span>
      RestApiId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayRestApi
</pre></div>
		</div>
				</div>
				<div class="elementor-element elementor-element-f6a9cdc elementor-widget elementor-widget-html" data-id="f6a9cdc" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"> ApiGatewayMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      ApiKeyRequired: false
      AuthorizationType: NONE
      HttpMethod: POST
      Integration:
        ConnectionType: INTERNET
        Credentials: <span style="color: #333399; font-weight: bold">!GetAtt</span> ApiGatewayIamRole.Arn
        IntegrationHttpMethod: POST
        PassthroughBehavior: WHEN_NO_MATCH
        TimeoutInMillis: 29000
        Type: AWS_PROXY
        Uri: <span style="color: #333399; font-weight: bold">!Sub</span> <span style="background-color: #fff0f0">&#39;arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunctionAddProject.Arn}/invocations&#39;</span>
      OperationName: <span style="background-color: #fff0f0">&#39;lambda&#39;</span>
      ResourceId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayResourceProjects
      RestApiId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayRestApi
</pre></div>

		</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-e480223" data-id="e480223" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-e9c300c elementor-widget elementor-widget-html" data-id="e9c300c" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  ApiGatewayResourceAttachments:
    Type: AWS::ApiGateway::Resource
    Properties:
      ParentId: <span style="color: #333399; font-weight: bold">!GetAtt</span> ApiGatewayRestApi.RootResourceId
      PathPart: <span style="background-color: #fff0f0">&#39;attachments&#39;</span>
      RestApiId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayRestApi
</pre></div>

		</div>
				</div>
				<div class="elementor-element elementor-element-d5bb21d elementor-widget elementor-widget-html" data-id="d5bb21d" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  ApiGatewayMethodAttachmentsGET:
    Type: AWS::ApiGateway::Method
    Properties:
      ApiKeyRequired: false
      AuthorizationType: NONE
      HttpMethod: GET
      Integration:
        ConnectionType: INTERNET
        Credentials: <span style="color: #333399; font-weight: bold">!GetAtt</span> ApiGatewayIamRole.Arn
        IntegrationHttpMethod: GET
        PassthroughBehavior: WHEN_NO_MATCH
        TimeoutInMillis: 29000
        Type: AWS
        Uri: <span style="color: #333399; font-weight: bold">!Sub</span> 
          - <span style="background-color: #fff0f0">&#39;arn:aws:apigateway:${AWS::Region}:s3:path/${BucketName}/attachments&#39;</span>
          - { <span style="color: #996633">BucketName</span>: <span style="color: #333399; font-weight: bold">!Ref</span> <span style="color: #996633">S3BucketMyProjectsManager</span> }
      OperationName: <span style="background-color: #fff0f0">&#39;GetAttachments&#39;</span>
      ResourceId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayResourceAttachments
      RestApiId: <span style="color: #333399; font-weight: bold">!Ref</span> ApiGatewayRestApi
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-3b2d7c2 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3b2d7c2" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9a1c066" data-id="9a1c066" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-394749c elementor-widget elementor-widget-text-editor" data-id="394749c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wenn wir eine POST Methode an unsere API schicken, wird die Lambda Funktion &#8222;LambdaFunctionAddProject&#8220; ausgeführt werden. Diese Funktion soll das im Payload der Anfrage mitgesendete Projekt in einer DynamoDb Tabelle speichern. Dazu brauchen wir eine Lambda Funktion Ressource und eine DynamoDb Tabelle. </p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-75eabb4 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="75eabb4" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-cf787e6" data-id="cf787e6" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6b44832 elementor-widget elementor-widget-heading" data-id="6b44832" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h5 class="elementor-heading-title elementor-size-default">DynamoDb</h5>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-cfe121d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="cfe121d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ba6ffed" data-id="ba6ffed" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-697e303 elementor-widget elementor-widget-html" data-id="697e303" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  ProjectsTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: ProjectsTable
      KeySchema:
        - AttributeName: <span style="background-color: #fff0f0">&quot;Id&quot;</span>
          KeyType: HASH
      AttributeDefinitions:
      - AttributeName: <span style="background-color: #fff0f0">&quot;Id&quot;</span>
        AttributeType: <span style="background-color: #fff0f0">&quot;S&quot;</span>
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-ae66ac9 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="ae66ac9" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f4dce84" data-id="f4dce84" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-cf5fc9c elementor-widget elementor-widget-heading" data-id="cf5fc9c" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h5 class="elementor-heading-title elementor-size-default">Lambda</h5>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-8e41c14 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="8e41c14" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-72b75bb" data-id="72b75bb" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-82cc5ab elementor-widget elementor-widget-html" data-id="82cc5ab" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"> LambdaFunctionAddProject:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: |
          <span style="color: #003366; font-weight: bold">import json</span>
          <span style="color: #003366; font-weight: bold">import boto3</span>
          <span style="color: #003366; font-weight: bold">import os</span>

          <span style="color: #003366; font-weight: bold">def handler(event, context):</span>
            <span style="color: #003366; font-weight: bold">project = event.get(&#39;Project&#39;)</span>
            <span style="color: #003366; font-weight: bold">dynamodb = boto3.resource(&#39;dynamodb&#39;)</span>
            <span style="color: #003366; font-weight: bold">table_name = os.environ[&#39;PROJECTS_TABLE&#39;]</span>
            <span style="color: #003366; font-weight: bold">table = dynamodb.Table(table_name)</span>
          <span style="color: #003366; font-weight: bold">  </span>
            <span style="color: #003366; font-weight: bold">response = table.put_item(</span>
              <span style="color: #003366; font-weight: bold">Item=project,</span>
              <span style="color: #003366; font-weight: bold">ReturnValues=ALL_NEW</span>
            <span style="color: #003366; font-weight: bold">)</span>

            <span style="color: #003366; font-weight: bold">return {</span>
              <span style="color: #003366; font-weight: bold">&#39;statusCode&#39;: 200,</span>
              <span style="color: #003366; font-weight: bold">&#39;headers&#39;: {</span>
                <span style="color: #003366; font-weight: bold">&quot;Access-Control-Allow-Headers&quot; : &quot;*&quot;,</span>
                <span style="color: #003366; font-weight: bold">&quot;Access-Control-Allow-Origin&quot;: &quot;*&quot;,</span>
                <span style="color: #003366; font-weight: bold">&quot;Access-Control-Allow-Methods&quot;: &quot;OPTIONS,POST,GET&quot;</span>
              <span style="color: #003366; font-weight: bold">}</span>
              <span style="color: #003366; font-weight: bold">&#39;body&#39;: json.dumps(response)</span>
            <span style="color: #003366; font-weight: bold">}</span>
      Description: AWS Lambda function
      FunctionName: <span style="background-color: #fff0f0">&#39;add-project&#39;</span>
      Handler: index.handler
      MemorySize: 256
      Role: <span style="color: #333399; font-weight: bold">!GetAtt</span> LambdaIamRoleDynamoDbAccess.Arn
      Runtime: python3.7
      Timeout: 60
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-f7176c3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f7176c3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0e0e2b1" data-id="0e0e2b1" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-4dd803c elementor-widget elementor-widget-text-editor" data-id="4dd803c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Das Deployment der Lambda Funktion kann entweder <strong><em>Inline </em></strong><strong> </strong>(wie im Beispiel) beschrieben werden  oder als Deployment Package in einer S3 Bucket gespeichert werden, dessen Speicherort in der Vorlage angegeben werden soll. Dieser <a href="https://aws.amazon.com/blogs/infrastructure-and-automation/deploying-aws-lambda-functions-using-aws-cloudformation-the-portable-way/">Artikel</a> zeigt beide Alternativen.</p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-4e6f143 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4e6f143" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-03daa1d" data-id="03daa1d" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-f9e33a3 elementor-widget elementor-widget-heading" data-id="f9e33a3" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h5 class="elementor-heading-title elementor-size-default">S3 Bucket</h5>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-4cd6958 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4cd6958" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b054ae2" data-id="b054ae2" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-a322ab2 elementor-widget elementor-widget-html" data-id="a322ab2" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">S3BucketMyProjectsManager:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: <span style="background-color: #fff0f0">&quot;my-projects-manager&quot;</span>
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-95e2a88 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="95e2a88" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-70f5a2c" data-id="70f5a2c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-01018c1 elementor-widget elementor-widget-heading" data-id="01018c1" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h5 class="elementor-heading-title elementor-size-default">IAM</h5>		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-3098dd7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3098dd7" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c2820c1" data-id="c2820c1" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-bb838ec elementor-widget elementor-widget-text-editor" data-id="bb838ec" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Damit unser Stack funktional sein kann, müssen wir den verschiedenen Ressourcen die richtigen Berechtigungen geben. Dies betrifft:</p><ul><li>Zugriff der Lambda auf die DynamoDb Tabelle</li><li>Ausführung der Lambda Funktionen von der API Gateway</li></ul>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-f77b277 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f77b277" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3315674" data-id="3315674" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<section class="elementor-section elementor-inner-section elementor-element elementor-element-7c8b31f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7c8b31f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-eb8cf2c" data-id="eb8cf2c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ba8ebc7 elementor-widget elementor-widget-html" data-id="ba8ebc7" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  ApiGatewayIamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: <span style="background-color: #fff0f0">&#39;2012-10-17&#39;</span>
        Statement:
          - Sid: <span style="background-color: #fff0f0">&#39;&#39;</span>
            Effect: <span style="background-color: #fff0f0">&#39;Allow&#39;</span>
            Principal:
              Service:
                - <span style="background-color: #fff0f0">&#39;apigateway.amazonaws.com&#39;</span>
            Action:
              - <span style="background-color: #fff0f0">&#39;sts:AssumeRole&#39;</span>
      Path: <span style="background-color: #fff0f0">&#39;/&#39;</span>
      Policies:
        - PolicyName: LambdaAccess
          PolicyDocument:
            Version: <span style="background-color: #fff0f0">&#39;2012-10-17&#39;</span>
            Statement:
              - Effect: <span style="background-color: #fff0f0">&#39;Allow&#39;</span>
                Action: <span style="background-color: #fff0f0">&#39;lambda:*&#39;</span>
                Resource: <span style="color: #333399; font-weight: bold">!GetAtt</span> LambdaFunctionAddProject.Arn
</pre></div>

		</div>
				</div>
					</div>
		</div>
				<div class="elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-4f3ddf8" data-id="4f3ddf8" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-8490bb5 elementor-widget elementor-widget-html" data-id="8490bb5" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">  LambdaIamRoleDynamoDbAccess:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: <span style="background-color: #fff0f0">&#39;2012-10-17&#39;</span>
        Statement:
          - Effect: <span style="background-color: #fff0f0">&#39;Allow&#39;</span>
            Principal:
              Service:
                - <span style="background-color: #fff0f0">&#39;lambda.amazonaws.com&#39;</span>
            Action:
              - <span style="background-color: #fff0f0">&#39;sts:AssumeRole&#39;</span>
      Description: <span style="background-color: #fff0f0">&quot;Gives</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">Read/Write</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">Access</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">DynamoDb</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">to</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">Lambda</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">Functions</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">executing</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">this</span><span style="color: #996633"> </span><span style="background-color: #fff0f0">role&quot;</span>
      Path: <span style="background-color: #fff0f0">&#39;/&#39;</span>
      RoleName: <span style="background-color: #fff0f0">&#39;lambda-dynamodb-read-write&#39;</span>
      Policies:
        - PolicyName: dynamodb-access
          PolicyDocument:
            Version: <span style="background-color: #fff0f0">&quot;2012-10-17&quot;</span>
            Statement:
              - Effect: Allow
                Action: <span style="background-color: #fff0f0">&#39;*&#39;</span>
                Resource: <span style="color: #333399; font-weight: bold">!GetAtt</span> ProjectsTable.Arn
</pre></div>

		</div>
				</div>
					</div>
		</div>
					</div>
		</section>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-9c3d2d3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9c3d2d3" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-aa35d51" data-id="aa35d51" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-80a32a2 elementor-widget elementor-widget-text-editor" data-id="80a32a2" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Um die Vorlage zu validieren können wir die AWS CLI benutzen:</p><p><code class="language-bash" data-lang="bash">aws cloudformation validate-template --template-body file://serverless.yml</code></p>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5599d5f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5599d5f" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-47015e5" data-id="47015e5" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-f4b8265 elementor-widget elementor-widget-text-editor" data-id="f4b8265" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wenn keine Fehler gemeldet wurden, können wir das Deployment mit diesem Befehl durchführen</p>
<pre><code class="language-bash" data-lang="bash">$ aws cloudformation deploy \
--stack-name my-projects-manager-api \
--template-file serverless.yaml \
--capabilities CAPABILITY_IAM</code></pre>						</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-e0fe55c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e0fe55c" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-32e3e0d" data-id="32e3e0d" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
							</div>
		</div>
					</div>
		</section>
				</div>
		<p>Der Beitrag <a href="https://www.inoteq.com/2021/02/15/integration-von-aws-services-in-einer-todo-list-app/">Serverless App mit AWS Services</a> erschien zuerst auf <a href="https://www.inoteq.com">INOTEQ GmbH</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.inoteq.com/2021/02/15/integration-von-aws-services-in-einer-todo-list-app/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
