GASからAWS APIを実行する

# はじめに
GAS（Google Apps Script）便利ですよね。
簡単に実行環境が整備出来て、その他のGoogleサービスとの相性も良いです。

またAWSの環境を導入している人も多いのではないでしょうか？
EC2やLambdaなど便利なサービスも多く、安定していて使い勝手が良いです。

今日はGASからAWSのAPI操作をするための下記のライブラリの使い方を紹介します。

[GitHub - smithy545/aws-apps-scripts: An interface to authenticate AWS api requests from within google scripts](https://github.com/smithy545/aws-apps-scripts)


# 使い方
## 前提
下記の条件が必要です。
- Googleアカウント持っていてGASが実行できる
- AWSアカウント持ってる
- AWSでアクセスキーの発行をしている
アクセスキーはIAMの画面から発行できるのでまだの人は事前に行ってください。
私はAWS CLI用に発行したものがあったのでそれを使って検証しました。
## ライブラリの使い方
### 最初の一歩
[aws-apps-scripts/aws.js at master · smithy545/aws-apps-scripts · GitHub](https://github.com/smithy545/aws-apps-scripts/blob/master/aws.js)
上記ライブラリのREADMEにも書いていますが、
`aws.js`の内容をコピペしてGASに貼り付けましょう。
その後最初の下記サンプルコードを動かしてみましょう。
```javascript
function firstSample() {
  AWS.init("自分のACCESS_KEY", "自分のSECRET_KEY");
  const instanceXML = AWS.request('ec2', 'ap-northeast-1', 'DescribeInstances', {"Version":"2015-10-01"});
  Logger.log(instanceXML)
}
```
第2引数のリージョンは自分の利用しているリージョンを指定しましょう。
無事にリクエストが成功すると、XML形式のログが出力されるはずです。
### 認証情報をスクリプトプロパティに保存
認証情報をスクリプトにべた書きするのはあまり好ましくないので
下記のスクリプトを使ってスクリプトプロパティに保存しましょう。
環境情報のようなもので、左メニューの歯車マークのプロジェクトの設定の
一番下からも設定、確認できます。
```javascript
/**
 * AWS 認証情報をプロパティサービスに設定する関数
 * この関数は一度だけ実行してください。
 */
function setAwsCredentials() {
  const properties = PropertiesService.getScriptProperties();
  properties.setProperty('AWS_ACCESS_KEY', '自分のACCESS_KEY');
  properties.setProperty('AWS_SECRET_KEY', '自分のSECRET_KEY');
}
```
上記を一度実行したら最初の関数を下記のように修正して再度実行してみましょう。
```javascript
  // プロパティサービスから AWS 認証情報を取得
  const properties = PropertiesService.getScriptProperties();
  const accessKey = properties.getProperty('AWS_ACCESS_KEY');
  const secretKey = properties.getProperty('AWS_SECRET_KEY');
  AWS.init(accessKey, secretKey);
  const instanceXML = AWS.request('ec2', 'ap-northeast-1', 'DescribeInstances', {"Version":"2015-10-01"});
  Logger.log(instanceXML)
```
先ほどと同じログが出れば成功です！
ここまでくればあとはいろいろなパラメータを指定するだけで
様々なAPIコールが可能になります！
よく使いそうなものを下にサンプルとしてあげてみたので利用してみて下さい。
## よく使うAPIコールのサンプル
### EC2
#### EC2インスタンスの起動
AWSのEC2インスタンスを起動するサンプルです。
下記コードを利用して、既に停止されているインスタンスを起動することができます。

```javascript
function startInstance() {
  const properties = PropertiesService.getScriptProperties();
  const accessKey = properties.getProperty("AWS_ACCESS_KEY");
  const secretKey = properties.getProperty("AWS_SECRET_KEY");
  AWS.init(accessKey, secretKey);

  const params = {
    Version: "2016-11-15",
    "InstanceId.1": "i-XXXXXXXXXXXXXXX",
  };

  const headers = {
    "Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
  };

  const instanceXML = AWS.request(
    "ec2",
    "ap-northeast-1",
    "StartInstances",
    params,
    "GET",
    null,
    headers,
    "/",
    null
  );

  Logger.log(instanceXML);
}
```

`InstanceId.1`には起動したいインスタンスのIDを指定してください。
複数指定したい場合は`InstanceId.2`など増やしていけば行けると思いますが、未検証です！
このコードを実行すると、指定したEC2インスタンスが起動されます。

#### EC2インスタンスの停止
AWSのEC2インスタンスを停止するサンプルです。
以下のコードを利用して、既に起動しているインスタンスを停止することができます。
```javascript
function stopInstance() {
  const properties = PropertiesService.getScriptProperties();
  const accessKey = properties.getProperty("AWS_ACCESS_KEY");
  const secretKey = properties.getProperty("AWS_SECRET_KEY");
  AWS.init(accessKey, secretKey);

  const params = {
    Version: "2016-11-15",
    "InstanceId.1": "i-XXXXXXXXXXXXXXX",
  };

  const headers = {
    "Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
  };

  const instanceXML = AWS.request(
    "ec2",
    "ap-northeast-1",
    "StopInstances",
    params,
    "GET",
    null,
    headers,
    "/",
    null
  );

  Logger.log(instanceXML);
}

```
`InstanceId.1`には停止したいインスタンスのIDを指定してください。
このコードを実行すると、指定したEC2インスタンスが停止されます。