---
# System prepended metadata

title: AWS Learn
tags: [AWS, SSL, DNS, IaC, cloud]

---

AWS Learn
===
###### tags: `AWS` `cloud` `IaC` `DNS` `SSL`

[TOC]

> This doc tutorial use `aws-cdk-lib` develop.

## Required
* [aws cli](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
* `npm i -g aws-cdk` this is cli module
* nodejs `^14.18.x`
* typescript `~4.9.4`
* `npm i -D @types/aws-lambda` interface

> change new region run once `$ cdk bootstrap`

## Basic Cli
* `$ aws s3 ls`
* `$ cdk init [--language typescript]`
* `$ cdk diff`
* `$ cdk deploy`
* `$ cdk destroy`
    will uninstall all deploy at this code.
* `$ cdk synth`
    review `CloudFormation` file

## ACM
[AWS Certificate Manager](https://ap-northeast-3.console.aws.amazon.com/acm/home?region=ap-northeast-3#/certificates/list)
[SSL For Free](https://www.sslforfree.com/)
[Google Domain](https://domains.google.com/registrar/cosmoit.codes/dns?hl=zh&_ga=2.120751307.2145633470.1674175535-1989676735.1674175535)

1. Request SSL cert
2. Use `CNAME` verify domain
    * NAME in Google.DNS.NAME `Warn!! SSL For Free Name have your domain, must remove domain like "_XXXXXXXXXXX.www.abc.com" => "_XXXXXXXXX"` 
    * point in Google.DNS.DATA
    * TTL 600 or 3600 (s)
3. Download cert.zip and unzip import to `ACM`
    * private.key
    * certificate.crt
    * ca_bundle.crt
4. If use nginx use `$ cat certificate.crt ca_bundle.crt >> certificate.crt`


## Serverless

new lambda function

`src/index.ts` => `dist/index.js`
```typescript=
import { APIGatewayEvent } from 'aws-lambda';

export const handler = async (e: APIGatewayEvent) => {
    return {
        statusCode: <httpStatusCode>,
        headers: { [key: string]: string },
        body: '<meta charset="utf-8"><h1>good 中文</h1>'
    }
};
```

`src/otherFunc.ts` => `dist/otherFunc.js`
```typescript=
import { APIGatewayEvent } from 'aws-lambda';

export const handler = async (e: APIGatewayEvent) => {
    return {
        statusCode: <httpStatusCode>,
        headers: { [key: string]: string },
        body: '<meta charset="utf-8"><h1>good 中文</h1>'
    }
};
```

`lib/<project>-stack.ts`
```typescript=
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigw from 'aws-cdk-lib/aws-apigateway';
import * as acm from 'aws-cdk-lib/aws-certificatemanager'

const main = new lambda.Function(this, 'lambda', {
    runtime: lambda.Runtion.NODEJS_18_X,
    handler: 'index.handler', // This <index> is `lambda.Code.fromAsset('dist')` filename, and <handler> is export function 
    code: lambda.Code.fromAsset('dist')
});

const otherFunc = new lambda.Function(this, 'otherFunc', {
    runtime: lambda.Runtime.NODEJS_18_X,
    handler: 'otherFunc.handler',
    code: lambda.Code.fromAsset('dist')
});

const apiGatewayName = 'Endpint';
const api = new apigw.LambdaRestApi(this, apiGatewayName, {
    handler: main
});

// If need mutiple apiGateway
const api = new apigw.LambdaRestApi(this, apiGatewayName, {
    handler: main,
    proxy: false
});


// Setting custom domain
const domain = 'www.abc.com';
const acmArn = 'arn:aws:acm:<region>:<IAM_ID>:certificate/xxxxxxxxxxx';
const resource = 'otherFunc';
const cert = acm.Certificate.fromCertificateArn(
    this,
    'Certificate',
    acmArn
);
// debug
// new cdk.CfnOutput(this, 'AcmArn', {
//     value: cert.certificateArn
// });
const api = new apigw.LambdaRestApi(this, apiGatewayName, {
    handler: main,
    proxy: false,
    domainName: {
        domainName: domain,
        certificate: cert
    }
});
api.root.addMethod('GET', new apigw.LambdaIntegration(main));
const otherApi = api.root.addResource(resource);
otherApi.addMethod('GET', new apigw.LambdaIntegration(otherFunc))
```

## EC2


## ECK
### ECR
### ECS